【问题标题】:inheritance via javascript通过javascript继承
【发布时间】: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


【解决方案1】:

你必须稍微修改一下你的superSupper

function superSupper(steak){
    // calling superclass constructor
    dinner.apply(this, arguments);
    this.steak=steak;
}

【讨论】:

  • 虽然在这里没关系,但您通常希望在设置自己的属性之前调用“超类”(以防您覆盖属性)。
  • 那么 apply 将继承的属性移动到实例化对象的范围内吗?
  • applycall 可用于在另一个对象的范围内执行函数。所以这里的 Dinner 会在 superSupper 的范围内执行,因此此时其中的 Dinner 中的 this 指的是 superSupper 并且 food 和 Dinner 成为了 superSupper 的属性
  • @Alex Pakka 感谢您的链接。我觉得我也应该学习经典继承
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多