我可以在 JavaScript 中模拟继承,只调用一个基构造函数,而不是使用原型吗?
Can I simulate inheritance in JavaScript just calling a base constructor, not using prototypes?
请看下面几种在 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
无法正常工作(即不会将子类实例视为基类实例)。
如果 - 以这种方式重写方法,则无法在需要时从基类调用实现(如果只想扩展功能,而不是完全替换它)。
- 如果要动态更改基类方法的实现,则需要原型。
当然,对于同一主题,这里还有其他问题。另请参阅:
- 使用原型与直接在构造函数中定义方法的优势?
- 为什么人们在javascript中使用原型,而使用apply()和调用()方法很容易继承?
- Javascript 继承;调用和原型
除了在本答案中描述的原型上定义方法的好处外,使用您的方法,Cow
的实例不是Animal
的实例,因此您不能使用instanceof
。 使用原型进行继承myCow instanceof Animal
会给true
.
相关文章:
- 如何从构造函数中调用js原型方法
- 通过原型/构造函数从复选框输出值
- Javascript:继承原型而不重新定义构造函数
- 使用sinon.js创建一个“;“间谍对象”;使用基于真实构造函数/原型的间谍方法
- 使用构造函数 - 原型从文本框输出值
- 在构造函数中定义函数会比将其附加到原型消耗更多的内存
- JS构造函数的原型属性与其原型之间的区别
- Javascript 中的构造函数不会返回由原型函数传递的正确值
- 构造函数原型-继承混淆
- 为什么我的代码认为 canvas 函数在 JavaScript 中的构造函数原型中是未定义的
- 我应该使用构造函数/原型吗?
- 对象文字与构造函数+原型
- 从画布构造函数原型中绘制图像
- 如何给构造函数/原型函数增加值?
- 构造函数.原型不在原型链中
- 向构造函数原型添加方法
- 为什么组合构造函数/原型模式返回对象类型
- 更改构造函数原型时出现问题
- 如何创建带有未分配属性的Javascript构造函数/原型
- 构造函数-原型- __proto__