我碰巧正在从《 You't Know JS:this&Object Prototypes》中学习原型,这是一本很棒的书,可以理解其下的设计并阐明许多误解(这就是为什么我要避免使用继承和类似的东西instanceof
)。
但是我有和人们在这里问的相同的问题。几个答案确实很有帮助并且很有启发性。我也很想分享我的理解。
什么是原型?
JavaScript中的对象具有内部属性,在规范中用表示[[Prototype]]
,这只是对另一个对象的引用。几乎所有对象都被赋予非null
为此属性值。
如何获得对象的原型?
通过__proto__
或Object.getPrototypeOf
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true
function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
什么是prototype
?
prototype
被一个对象作为一个特殊的属性自动创建功能,其被用于建立委派(继承)链,又名原型链。
当我们创建函数时a
,prototype
会自动创建为on的特殊属性,a
并将函数代码另存为constructor
on prototype
。
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
我很乐意将此属性视为存储功能对象的属性(包括方法)的地方。这也是为什么在JS效用函数等规定的原因Array.prototype.forEach()
,Function.prototype.bind()
,Object.prototype.toString().
为什么要强调功能的性质?
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}
// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
所以Arary
,Function
,Object
是所有功能。我应该承认,这刷新了我对JS的印象。我知道函数是JS中的一等公民,但似乎它是基于函数构建的。
__proto__
和之间有什么区别prototype
?
__proto__
引用适用于每个对象以引用其[[Prototype]]
属性。
prototype
是作为函数的特殊属性自动创建的对象,其被用于存储一个功能对象的属性(包括方法)。
有了这两个,我们就可以在思维上绘制原型链。如下图所示:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
从不同constructor.prototype
?