Javascript-可以模拟经典的OOP继承吗?
我想知道,考虑到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(
//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();