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.prototypePoint.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。

链接地址: http://www.djcxy.com/p/30059.html

上一篇: VS. prototype in JavaScript

下一篇: javascript prototypal inheritance and the 'new' keyword