我不确定在原型继承中处理“超级”对象的正确方法(如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日更新 我放弃了原型继承。有一天我会切换到打字稿,我认为......
答案 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
类,我不会看到你将如何做到这一点。