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