原型继承中的超级

时间:2016-01-04 18:20:24

标签: javascript

我不确定在原型继承中处理“超级”对象的正确方法(如Douglas Crockford所述)应该是这样。目前我正在使用this.__proto__,这会在创建新对象时导致奇怪的行为。这是一个简单的例子。

var Animal = { talk: function() { return "I am an animal"}}
var Cat = Object.create(Animal);                            
Cat.talk = function(){return "I am a cat. " + this.__proto__.talk()}; 
var myCat = Object.create(Cat)
console.log(myCat.talk());

我想要的最终结果是“我是一只猫。我是一只动物。”相反,我得到的是“我是一只猫。我是一只猫。我是一只动物。”这很有道理,因为myCat的原型是Cat,而不是动物!

如何处理此行为以从我熟悉和喜爱的其他语言复制继承?

2015年1月5日更新 我放弃了原型继承。有一天我会切换到打字稿,我认为......

2 个答案:

答案 0 :(得分:2)

你应该调用动物的谈话功能,但是让你的猫进入thisArg

Animal.talk.call( this );

所有在一起:

var Animal = { talk: function() { return "I am an animal"}}
var Cat = Object.create(Animal);                            
Cat.talk = function(){return "I am a cat. " + Animal.talk.call( this )}; 
var myCat = Object.create(Cat)
console.log(myCat.talk());

答案 1 :(得分:1)

您需要明确提及动物 Cat 的父级

var Animal = { talk: function() { return "I am an animal"}}
var Cat = Object.create(Animal);           
Cat.parent = Animal;    //so that you can invoke its method later
Cat.talk = function(){return "I am a cat. " + this.parent.talk.call(this)}; 
var myCat = Object.create(Cat);

除此之外,如果没有在定义Animal时专门引用Cat.talk类,我不会看到你将如何做到这一点。