Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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-可以模拟经典的OOP继承吗?_Javascript_Oop_Inheritance_Prototype_Prototypal Inheritance - Fatal编程技术网

Javascript-可以模拟经典的OOP继承吗?

Javascript-可以模拟经典的OOP继承吗?,javascript,oop,inheritance,prototype,prototypal-inheritance,Javascript,Oop,Inheritance,Prototype,Prototypal Inheritance,我想知道,考虑到javascript原型继承的局限性,是否有可能像在其他OOP语言中看到的那样模拟基于类的继承 我创建了一个超类和子类,如下所示: //Parent function Animal(i) { //Some constructor implementation } //Child function Pig(i) { //Some additional constructor implementation } Pig.prototype = new Animal(

我想知道,考虑到javascript原型继承的局限性,是否有可能像在其他OOP语言中看到的那样模拟基于类的继承

我创建了一个超类和子类,如下所示:

//Parent
function Animal(i)
{
    //Some constructor implementation
}

//Child
function Pig(i)
{
    //Some additional constructor implementation
}

Pig.prototype = new Animal();
我是否可以确保子对象继承其父对象的函数,而不需要显式调用它们,或在子对象中创建它们

Animal.prototype.eat = function()
{
    console.log("eating...");
}

Pig.eat(); //No implementation of eat in the Pig object
我是否可以确保子对象除了继承自己的对象变量外,还继承其父对象的所有对象变量,而无需像下面这样显式调用父对象的构造函数:

function Pig(i) 
{
    User.call(this, i);
    //Some pig-like variables
}
基本上,我希望在父类中创建所有实现,只编写需要重写的函数+子类中的任何附加函数。如果我想调用Pig.eat(),如果子对象中不存在父函数,我希望它使用父函数。在创建一个Pig对象时,我希望它除了继承自己的唯一变量外,还继承其父变量。这可能吗

我希望在父类中创建所有实现,只编写需要重写的函数+子类中的任何其他函数

它实际上是这样工作的。 可能您只是做错了一点,请参见以下示例:

//父对象
功能动物()
{
this.animalInstinct=true;
}
Animal.prototype.eat=函数()
{
警惕(“吃…”);
}
//孩子
功能清管器()
{
this.nose='pigNose'
}
Pig.prototype=新动物();
清管器=新清管器();

猪。吃()//在Pig对象中有eat的实现
查看ES6方式,可以使用类似的方法轻松地将其编译成ES5

如果你想看到一个ES5版本,可以将上面的内容复制粘贴到Babel的live中,或者在最新版本的Chrome上测试一下。 然后,您可以执行以下操作:

var pig = new Pig();
pig.eat().play().eat().makeBacon();

首先,您需要先创建一个
新Pig
实例,然后才能对其调用
eat
等方法。不,就像在经典继承中一样,每次都需要显式地调用
super
(这里:
Animal.call(this,i);
)。当然,在JS中,您可能可以通过元编程获得一些好处。“我可以确保子对象继承其父对象的函数,而不需要显式调用它们,也不需要在子对象中创建它们吗?”您似乎真的需要了解。我鼓励您接受JavaScript的原型继承,忘记基于类的继承。相关:
var pig = new Pig();
pig.eat().play().eat().makeBacon();