在JavaScript中,当我们实例化派生对象时,原型的函数隐藏在哪里?

时间:2012-08-17 15:07:41

标签: javascript inheritance prototypal-inheritance

我目前正在试图弄清楚原型继承在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没有分配原型。那么,如果属性不是拥有并且没有原型,那么它们来自哪里?我觉得现在某种图表非常好。

2 个答案:

答案 0 :(得分:4)

只有一个函数具有属性prototype

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

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

Object.getPrototypeOf(instance) === base // return true

答案 1 :(得分:1)

此页面可以帮助您:

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

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