1

__proto__属性

__proto__:每个对象都有一个__proto__属性,相当于一个指针,可以指向某原型对象,并且引用其属性及方法。(有些浏览器没有)

var a = { 
x: 10, 
calculate: function (z) { 
return this.x + this.y + z 
} 
}; 
var b = { 
y: 20, 
__proto__: a 
}; 

var c = { 
y: 30, 
__proto__: a 
}; 
b.calculate(30); // 60

图片描述

__proto__的默认指向

它指向的是最高级的Object.prototype,而Object.prototype的__proto__为空

var d = {};
d.__proto__//Object {}
d.__proto__ === Object.prototype//true
Object.prototype.__proto__//null

prototype属性

原理说明

创建构造函数foo时,同时创建了一个原型对象foo {}并将其存储于foo.prototype中(FunctionName.prototype相当于一个原型对象),a是foo的一个实例可以通过a.__proto__访问到构造函数foo的原型对象。同时,此原型对象又有名为constructor的属性,它反过来引用函数本身。

function foo(){}
var a = new foo()
a.__proto__//foo {}
a.__proto__ === foo.prototype//true
foo.prototype.constructor//function foo(){}

实例解析

function Foo(y){ 
this.y = y ; 
} 
Foo.prototype.x = 10; 
Foo.prototype.calculate = function(z){ 
return this.x+this.y+z; 
}; 
var b = new Foo(20); 
console.log(b.calculate(30));//60

图片描述

引申

所以,在构造函数原型对象没有改写的情况下,我们可以通过constructor属性判断某个实例的构造函数是谁。

例1.function foo(){};
    var a = new foo();
    a.constructor//function foo(){}
例2.var b = {};
    b.constructor//function Object() { [native code] }
    Object.prototype//Object {}
    Object.prototype.constructor//function Object() { [native code] }

总结

实例的__proto__属性指向其构造函数的prototype属性里的原型对象


阿花和猫
2.3k 声望138 粉丝