协慌网

登录 贡献 社区

__proto__VS。 JavaScript 原型

该图再次显示每个对象都有一个原型。构造函数 Foo 还具有自己的__proto__ ,即 Function.prototype,而该__proto__又通过其__proto__属性再次引用了 Object.prototype。因此,重复一遍,Foo.prototype 只是 Foo 的显式属性,它引用 b 和 c 对象的原型。

var b = new Foo(20);
var c = new Foo(30);

__proto__prototype什么区别?

在此处输入图片说明

该图取自dmitrysoshnikov.com

答案

__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会在此时保存到myPoint.__proto__

声明函数时创建原型属性。

例如:

function Person(dob){
    this.dob = dob
 };

声明上述函数后,将在内部创建 Person.prototype 属性。可以将许多属性添加到 Person.prototype 中,这些属性由使用 new Person()创建的 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 个对象可以将Person.prototype age方法称为person1.ageperson2.age

在上一个问题的图片中,您可以看到Foo是一个Function Object ,因此它具有指向Function.prototype__proto__链接,而__proto__则是Object的实例,并且具有指向Object.prototype__proto__链接。 proto 链接在此处以Object.prototype __proto__指向null

任何对象都可以访问其通过__proto__链接的原型链中的所有属性,从而构成原型继承的基础。

__proto__不是访问原型链的标准方法,标准但相似的方法是使用Object.getPrototypeOf(obj)

下面的instanceof运算符代码可提供更好的理解:

当对象是 Class 的实例时,对象instanceof Class 运算符将返回true ,更具体地说,如果在该对象的原型链中找到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。