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