构造函数、原型及原型链

1、构造函数

funcion Foo (name,age){
    this.name=name;
    this.age=age;
    this.class='class-1';
    return this;//默认return this,可不用写
}
var f = new Foo('gouhuan',18);
var f2 = new Foo('zhaohuanling',18);
new一个对象的过程

例如:f,f传递或不传递参数。先将构造函数中的this置为空对象,接着一个一个属性赋值,最后return this,return后,f被赋值。

  1. 创建一个新对象;
  2. 然后,this指向这个对象
  3. 执行代码,给this赋值
  4. 返回this
构造函数扩展
var a = {}---var a = new Object();
var a = []---var a = new Array();
funcion foo(){}---
var foo = new Funcion();

变量 instanceof 类型

2、原型规则

所有的引用类型(对象、数组、函数)都具有对象的特性,及可自由扩展性。null除外
var a={};   a.a=100;
var b=[];   b.a=100;
function foo(){};
foo.a=100
所有引用类型都包含一个__proto__(隐式原型),他的属性值为一个普通的队形
a.__proto__
b.__proto__
foo.__proto__
所有函数都有一个prototype属性
foo.prototype
所有引用类型的__proto__的值直指(===)其构造函数的prototype
a.__proto__ === Object.prototype;
b.__proto__ === Object.prototype;
foo.__ptoto__ === Object.prototype;
如果试图在一个对象(引用类型)中寻找一个属性,但对象本身没有这个属性,即会在他的__proto__ 即它构造函数的prototype中寻找
function Foo(name,age){
    this.name=name;
    this.age=age;
}
Foo.prototype.alertName = function(){
    alert(this.name);
}

//new 一个新的Foo类型的对象,Foo为构造函数

var f=new Foo('gouhuan');
f.printName = function(){
    console.log(this.name);
}

<!--运行结果-->
f.printName();//gouhuan
f.alertName();//弹出gouhuan,
//虽然f对象本身没有alertName属性,但其构造函数的prototype中存在这个属性
for in 遍历对象属性

虽然在目前高级浏览器已经屏蔽了构造函数原想上的属性,但为保证代码的健壮即兼容性,建议使用:hasOwnProperty;

for (item in obj){
    if(obj.hasOwnProperty(item)){
        console.log(obj.item);
        console.log(obj[item]);
        console.log(item)
    }
}

原型链

f–>f.proto–>(f.proto).prpto

在刚刚的例子中:
f.toString();
则先回在f中找toString属性,没有,则寻找Foo其构造函数的prototype即f本身的隐式原型中查找toString,还是没有。
Foo本身是一个函数对象,则还会继续向上查找
Object.prototype,即Foo.__proto__;
最后合起来就是一个原型链
f.__proto__.__proto__
使用 instanceof,判断引用类型属于哪个构造函数
 f instanceof Foo;//true
 f instanceof Object;//true

判断逻辑就是,f的__proto__一层层往上,看能否找到对应Foo的prototype。

typeof 是无法判断出数组和函数的,最终结果都为Object
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值