【发布时间】:2015-04-29 14:32:25
【问题描述】:
我正在做一个项目,并决定实现我想要的功能的最佳方式是重写一个方法。当时我没有意识到 javascript 没有调用 super() 的概念,所以我开始做一些研究。
我发现一篇文章 (http://blog.salsify.com/engineering/super-methods-in-javascript) 描述了调用超级方法的几种方法。
不过,我对这些选项中的任何一个都不太满意,并提出了以下建议。也可以在https://jsfiddle.net/fpgm8j9n/ 的小提琴上找到。
var Food = function( name ){
this.name = name;
}
Food.prototype.sayName = function(){
console.log( 'I am a ' + this.name );
}
var Fruit = function( name, color ){
Food.call( this, name );
this.color = color;
this.super = Object.getPrototypeOf( Object.getPrototypeOf( this ) );
}
Fruit.prototype = Object.create( Food.prototype );
Fruit.prototype.sayName = function(){
console.log( 'I am a fruit and I am the color ' + this.color );
}
var orange = new Fruit( 'apple', 'red' );
// runs the overridden method in orange
orange.sayName(); // I am a fruit and I am the color red
// runs the super method
orange.super.sayName.call( orange ); // I am a apple
以下是我发布的文章中的第一个示例。这些本质上是否相同,而无需知道您的父原型?我提出的实现有什么问题或有什么可以改进的吗?我对 javascript 中的 OOP 还很陌生,并且对很多概念感到有点摇摆不定。
var Child = Parent.extend({
// ...
doSomething: function(x, y) {
this.doSomethingElse(x);
return Parent.prototype.doSomething.call(this, x, y);
}
});
【问题讨论】:
-
这只是我的几句话。 javascript 并不是真正的多态语言。不要强迫自己像其他多态语言一样使用它。
-
我建议阅读 You Don't Know JS: this & Object Prototypes (specifically chapter 4) 以了解 JavaScript 在继承方面可以为您提供什么。
-
我做了一个javascript类系统,可以从github.com/JakarCo/JDOM获得,你可以试试。我在codereview.stackexchange.com/questions/87983/…@ 上的代码审查问题中有几个示例用法
标签: javascript oop inheritance