2

请看下面在 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将无法正常工作(即不会将子类实例视为基类实例)。
  • 如果以这种方式重写方法,则无法在需要时从基类调用实现(如果您只想扩展功能,而不是完全替换它)。
  • 如果要动态更改基类方法的实现,则需要原型。

当然,对于同一主题,这里还有其他问题。也可以看看:

4

1 回答 1

1

In addition to the benefits of defining methods on the prototype described in this answer, with your method an instance of Cow is not an instance of Animal, so you can't use instanceof. With inheritance using prototypes myCow instanceof Animal would give true.

于 2013-09-17T21:06:21.413 回答