我可以在JavaScript中模拟继承而只是调用基础构造函数,而不是使用原型吗?

时间:2013-09-17 20:58:52

标签: javascript inheritance

请查看以下方法来模拟JavaScript中的继承。它非常简单,根本不使用原型。它似乎运作良好,但我怀疑它有问题,只是因为人们通常不这样做。任何人都可以解释一下,这种方法的缺点是什么,我缺少什么?非常感谢。

// The base class constructor
function Animal(name)
{
    var _name = name; // local variable, not visible to subclass

    this.greeting = function()
    {
        return "Hello, "+_name;
    }

    this.makeSound = function()
    {
        return "Don't know what to say";
    }
}

// The subclass constructor
function Cow(name)
{
    Animal.call(this, name); // call the base constructor

    this.makeSound = function()  // override base class's method
    {
        return "Mooooo!";
    }
}

var myCow = new Cow("Burenka");

console.log(myCow.greeting());  // call inherited method
console.log(myCow.makeSound()); // call overriden method

更新 感谢大家的回答和评论。总结一下:

可以使用此方法,但存在一些限制:

  • 每个实例构建都是从头开始执行,而不仅仅是设置原型链接 - 这可能会影响性能。
  • 每个实例都包含所有基类方法的定义 - 浪费内存。
  • instanceof将无法正常工作(即不会将子类实例视为基类实例)。
  • 如果以这种方式覆盖方法,则无法在需要时从基类调用实现(如果您只想扩展功能,而不是完全替换它)。
  • 如果要动态更改基类方法的实现,则需要原型。

当然,对于同一主题,还有其他问题。另见:

1 个答案:

答案 0 :(得分:1)

除了在in this answer描述的原型上定义方法的好处之外,使用您的方法,Cow的实例不是Animal的实例,因此您无法做到使用instanceof。使用原型myCow instanceof Animal进行继承会得到true