首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >__proto__ VS.JavaScript中的原型

__proto__ VS.JavaScript中的原型
EN

Stack Overflow用户
提问于 2012-04-01 05:13:14
回答 32查看 233.2K关注 0票数 913

这个图再次表明每个对象都有一个原型。构造函数Foo也有自己的__proto__,即Function.prototype,它反过来也通过其__proto__属性再次引用Object.prototype。因此,重复一遍,Foo.prototype只是Foo的一个显式属性,它引用b和c对象的原型。

代码语言:javascript
复制
var b = new Foo(20);
var c = new Foo(30);

__proto__prototype之间的区别是什么

该图取自dmitrysoshnikov.com

注意:现在有上述2010年文章的。

EN

回答 32

Stack Overflow用户

回答已采纳

发布于 2012-04-01 05:16:59

__proto__是在查找链中用于解析方法等的实际对象。prototype是在使用new创建对象时用于构建__proto__的对象

代码语言:javascript
复制
( new Foo ).__proto__ === Foo.prototype;
( new Foo ).prototype === undefined;
票数 890
EN

Stack Overflow用户

发布于 2012-04-01 05:20:02

prototype是函数对象的属性。它是由该函数构造的对象的原型。

__proto__是对象的内部属性,指向其原型。尽管事实上的标准__proto__更快,但当前标准提供了等效的Object.getPrototypeOf(obj)方法。

您可以通过将函数的instanceof与对象的prototype链进行比较来查找__proto__关系,并可以通过更改prototype来打破这些关系。

代码语言:javascript
复制
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__

票数 391
EN

Stack Overflow用户

发布于 2013-08-10 23:27:33

prototype属性在声明函数时创建。

例如:

代码语言:javascript
复制
 function Person(dob){
    this.dob = dob
 }; 

一旦声明了上面的函数,就会在内部创建Person.prototype属性。可以将许多属性添加到Person.prototype中,这些属性由使用new Person()创建的Person实例共享。

代码语言:javascript
复制
// adds a new method age to the Person.prototype Object.
Person.prototype.age = function(){return date-dob}; 

值得注意的是,默认情况下,Person.prototype是一个Object文本(可以根据需要进行更改)。

使用new Person()创建的每个实例都有一个指向Person.prototype__proto__属性。这是用于遍历以查找特定对象的属性的链。

代码语言:javascript
复制
var person1 = new Person(somedate);
var person2 = new Person(somedate);

创建两个Person实例,这两个对象可以调用Person.prototypeage方法作为person1.ageperson2.age

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

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

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

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

当对象是类的实例时,对象instanceof类运算符返回true,更具体地说,如果在该对象的原始链中找到Class.prototype,则该对象是该类的实例。

代码语言:javascript
复制
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是类的实例,则返回true。

票数 145
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9959727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档