【发布时间】:2012-03-14 16:28:38
【问题描述】:
我一直在试验 javascript 的原型继承,并且遇到了一些或许可以解释的东西。
function dinner(food,drink){
this.food=food;
this.drink=drink;
}
dinner.prototype.desert=function(){
var x = this.food;
return x.split(' ')[0]+' Ice Cream Float';
}
function superSupper(steak){
this.steak=steak;
}
superSupper.prototype= new dinner();
superSupper.prototype.constructor=superSupper;
var x = new superSupper('corn','beet juice')
x.grub='beef';
x.clams = 'nope';
在上面的代码中,我正在创建一个新的构造器“superSupper”并使其继承自晚餐。当在 console.log 中查看时,我会看到:
superSupper
clams: "nope"
grub: "beef"
steak: "corn"
__proto__: dinner
constructor: function superSupper(steak){
drink: undefined
food: undefined
__proto__: dinner
如何访问我现在从晚餐继承的饮料和食物属性?
附言试试这个:"x.food='some string'" 只在 superSupper 实例中创建一个名为 food 的新属性,但不会为继承的 food 属性赋值。
【问题讨论】:
-
我不完全确定你想要什么,但更改继承的属性意味着 all
superSupper实例将设置该属性,因为继承的dinner实例已共享。 -
我试图做的是访问/分配继承的属性,换句话说,给他们一个这个实例的值。我已经尝试了很多,但它们仍然未定义
-
@pimvdb 从我的阅读方式来看,我认为他希望能够访问 superSupper.food,因为 superSupper “延长”晚餐
-
@code wombat:我仍然认为这不是你想要的。您创建的
dinner实例被设置为superSupper的原型,因此如果您在该dinner实例上设置一个属性,所有superSupper实例将设置该属性。如果您想在每个superSupper-instance 的基础上设置它,那么我认为您不想更改继承的属性。 -
是的,这与类相同。一旦在父类中定义了属性,就不能从子类中删除它。
hasOwnProperty允许区分,是在某个实例中定义的属性,还是它的原型之一。
标签: javascript inheritance prototype