您的当前位置:首页正文

javascript中__proto__与prototype区别

来源:华拓网

__proto__ (隐式原型 implicit prototype link)
prototype (显示原型 explicit prototype property)
关系: 隐式原型指向创建这个对象的函数(constructor)的prototype

1.先看一般的对象实例

var obj = {},
      str = 'nihao',
      num = 99;

obj.prototype           // => undefined
str.prototype           // => undefined
num.prototype           // => undefined

obj.__proto__         //=> Object{...}
str.__proto__          //=> String{...}
num.__proto__          //=> Number{...}

2.再看Function

Object.__proto__         //=> function(){...}
Object.prototype          //=> Object{...}

String.__proto__          //=> function(){...}
String.prototype           //=> String{...}

function Foo() {
    ...
}
Foo.__proto__                //=> function(){...}
Foo.prototype                 //=> Object{constructor: function}

__proto__ 指向构造函数的原型, 这样保证实例能够访问在构造函数原型中的属性和方法.
prototype 是方法(Function)特有的属性, 这个属性是一个对象, 包含所有实例共享的属性和方法, 其中有一个属性叫做constructor, 指向原构造函数
所以有:

var foo1 = new Foo(),
      foo2 = new Foo();
foo1.__proto__ ===  Foo.prototype               //=> true
foo2.__proto__ === foo1.__proto__             //=> true
Foo.prototype.constructor === Foo           //=> true

那么Foo.__proto__指向哪里呢?

Foo.__proto__ === Function.prototype        //=> true

同理Object, String, Number的__proto__都指向 Function.prototype
那么Function.prototype.__proto__指向哪里?

Function.prototype.__proto__ === Object.prototype   //=> true

最后

Object.prototype.__proto__ === null    //=> true

总结:
用oop的思维来说, 就是prototype是用来给子类继承的, 而__proto__ 指向了父类的prototype