Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在JavaScript中模拟继承,只调用一个基本构造函数,而不使用原型吗?_Javascript_Inheritance - Fatal编程技术网

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

我可以在JavaScript中模拟继承,只调用一个基本构造函数,而不使用原型吗?,javascript,inheritance,Javascript,Inheritance,请看以下在JavaScript中模拟继承的方法。它非常简单,而且根本不使用原型。它似乎工作得很好,但我怀疑它有问题,只是因为人们通常不这样做。谁能解释一下,这种方法的缺点是什么,我缺少什么?非常感谢 // The base class constructor function Animal(name) { var _name = name; // local variable, not visible to subclass this.greeting = function()

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

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


除了在所述原型上定义方法的好处之外,使用您的方法,
奶牛
的实例不是
动物
的实例,因此您不能使用
实例。如果继承使用原型
myCow instanceof Animal
将给出
true

这样做,那么你在复制所有实例的所有方法,为什么要避免原型?我试图理解“不使用原型”的趋势应该是什么。原型是JavaScript的面向对象模型的基础。如果您想在Javascript中实现OO,请使用原型,而不是试图模拟任何东西。您的
问候语
方法不是继承的,而是在Anumal构造函数中分配的。所以从技术上讲,这不是继承。好吧,你没有做正确的继承,你只是在用另一个上下文扩展这个。您甚至可以这样做:
var myCow=Cow.call({},“Burenka”)
,它仍然可以工作;没有继承。原型链是语言实现继承的方式,也是为了自己的使用。想象一下,如果JavaScript使用您的技术:每个新对象都必须有
对象中所有内容的副本;每个函数都有它的副本,加上
function.prototype
;每个字符串都有自己的
子字符串
方法和朋友的副本,等等。不是很有效率,对吧?谢谢你的链接,我找不到答案。改变prototype的方法来改变所有实例的行为看起来并不是普遍需要的。但你对instanceof的看法是对的。好吧,让我们等待更多的答案,也许还有别的。。。