prototype
属性是在声明函数时创建的。
例如:
function Person(dob){
this.dob = dob
};
Person.prototype
一旦你声明了上面的函数,属性就会在内部创建。许多属性可以添加到Person.prototype
由Person
使用创建的实例共享的new Person()
.
// adds a new method age to the Person.prototype Object.
Person.prototype.age = function(){return date-dob};
值得注意的Person.prototype
是Object
,默认情况下是一个文字(可以根据需要更改)。
使用创建的每个实例new Person()
都有一个__proto__
指向Person.prototype
. 这是用于遍历以查找特定对象的属性的链。
var person1 = new Person(somedate);
var person2 = new Person(somedate);
创建 2 个实例Person
,这 2 个对象可以调用as 、 的age
方法。Person.prototype
person1.age
person2.age
在您的问题的上图中,您可以看到它Foo
是 a Function Object
,因此它有一个__proto__
指向 的链接,而Function.prototype
后者又是 的一个实例Object
并具有__proto__
指向 的链接Object.prototype
。proto 链接在此处结束__proto__
,Object.prototype
指向null
.
任何对象都可以访问其原型链中由 链接的所有属性__proto__
,从而形成原型继承的基础。
__proto__
不是访问原型链的标准方法,标准但类似的方法是使用Object.getPrototypeOf(obj)
.
下面的instanceof
运算符代码可以更好地理解:
当对象是类的实例时,对象instanceof
类运算符返回true
,更具体地说,如果Class.prototype
在该对象的原型链中找到,则该对象是该类的实例。
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)
如果对象是类的实例,则返回true。