VS. JavaScript中的原型
这个图再次表明每个物体都有一个原型。 构造函数Foo也有它自己的__proto__ ,它是Function.prototype,并且它又通过它的__proto__属性再次引用Object.prototype。 因此,重复一遍,Foo.prototype只是Foo的一个显式属性,它指向b和c对象的原型。
var b = new Foo(20);
var c = new Foo(30);
__proto__和prototype属性之间有什么区别?

这个数字是从这里取的。
__proto__是在查找链用来解决方法,实际的对象等prototype是用于构建对象__proto__当你创建一个对象new :
( new Foo ).__proto__ === Foo.prototype
( new Foo ).prototype === undefined
prototype是Function对象的一个属性。 它是由该函数构造的对象的原型。
__proto__是一个对象的内部属性,指向它的原型。 目前的标准提供了一个等效的Object.getPrototypeOf(O)方法,尽管事实上的标准__proto__更快。
您可以通过比较函数的prototype和对象的__proto__链来找到instanceof关系,并且可以通过更改prototype来打破这些关系。
function Point(x, y) {
this.x = x;
this.y = y;
}
var myPoint = new Point();
// the following are all true
myPoint.__proto__ == Point.prototype
myPoint.__proto__.__proto__ == Object.prototype
myPoint instanceof Point;
myPoint instanceof Object;
这里Point是一个构造函数,它构建一个对象(数据结构)。 myPoint是一个由Point()构造的对象,所以Point.prototype在Point.prototype被保存到myPoint.__proto__中。
Prototype属性是在声明函数时创建的。
例如:
function Person(dob){
this.dob = dob
};
Person.prototype属性是在声明上面的函数时在内部创建的。 可以将许多属性添加到Person.prototype中,这些属性由使用新Person()创建的Person实例共享。
// adds a new method age to the Person.prototype Object.
Person.prototype.age = function(){return date-dob};
值得注意的是, Person.prototype默认是一个Object字面值(它可以根据需要进行更改)。
使用新的Person()创建的每个实例都具有指向Person.prototype的__proto__属性。 这是用来遍历以找到特定对象的属性的链。
var person1 = new Person(somedate);
var person2 = new Person(somedate);
创建2个Person实例,这2个对象可以调用Person.prototype的age属性为person1.age,person2.age。
在上面的图片中,你可以看到Foo是一个函数对象,因此它有一个到Function.prototype的__proto__链接,而该对象又是Object的一个实例,并且有一个到Object.prototype的__proto__链接。 Proto链接在Object.prototype中的__proto__指向null时结束。
任何对象都可以访问__proto__链接的其原始链中的所有属性,从而形成原型继承的基础。
__proto__不是访问原型链的标准方式,标准但类似的方法是使用Object.getPrototypeOf(obj)。
下面的instanceof运算符的代码给出了一个更好的理解:
object instanceof当一个对象是一个Class的实例时,Class运算符返回true ,更具体地说,如果在该对象的proto链中发现了Class.prototype ,那么该对象就是该Class的一个实例。
function instanceOf(Func){
var obj = this;
while(obj !== null){
if(Object.getPrototypeOf(obj) === Func.prototype)
return true;
obj = Object.getPrototypeOf(obj);
}
return false;
}
上述方法可以称为: instanceOf.call(object,Class) ,如果object是Class的实例,则返回true。
上一篇: VS. prototype in JavaScript
下一篇: javascript prototypal inheritance and the 'new' keyword
