1

我目前正试图弄清楚原型继承在 JavaScript 中是如何工作的。这是我目前试图解决的谜团。

假设我们设置了以下结构:

var base = { greet : "hello" }

var child = function () {}

child.prototype = base;
child.prototype.protoSomething = function () {}

var instance = new child();

没有什么花哨。现在让我们看看instance属性(拥有或其他)有什么:

for(prop in instance) {
    console.log(prop); // prints 'greet', 'protoSomething'
}

好的,所以它有greetprotoSomething他们instance是自己的成员吗?

for(prop in instance) {
    if(instance.hasOwnProperty(prop))
        console.log(prop); // nothing is printed
}

不,自己的财产清单是空的。它们在instance的原型中吗?

if(instance.prototype === undefined) {
    console.log("'instance' has no prototype"); // gets printed
}

好吧,真可惜,instance没有分配原型。那么,如果这些属性不是自己的并且没有原型,那么它们是从哪里来的呢?在这一点上,我觉得某种图表会非常好。

4

2 回答 2

4

只有函数具有属性 prototype

instance.constructor.prototype === base // return true

要获取对象的原型,您应该使用Object.getPrototypeOf方法。

Object.getPrototypeOf(instance) === base // return true
于 2012-08-17T15:11:05.683 回答
1

此页面应该可以帮助您:

http://joost.zeekat.nl/constructors-considered-mildly-confusing.html

简而言之,实例的“幕后”原型(通过创建new)无法以任何方式访问,因此它返回undefined.prototype当您尝试检索它时,只有构造函数(您在其上手动设置了属性)才会返回任何内容。

于 2012-08-17T15:17:08.283 回答