假设您有以下代码:
function A() {
function modify() {
x = 300;
y = 400;
}
var c = new C();
}
function B() {
function modify(){
x = 3000;
y = 4000;
}
var c = new C();
}
C = function () {
var x = 10;
var y = 20;
function modify() {
x = 30;
y = 40;
};
modify();
alert("The sum is: " + (x+y));
}
现在的问题是,是否有任何方法可以用A
和B
中的方法覆盖C
中的modify
方法。在Java语言中,您可以使用super
-keyword,但是在JavaScript中如何实现这样的功能呢?
发布于 2016-03-02 05:56:00
由于这是谷歌上的热门话题,我想给出一个最新的答案。
使用ES6 classes使得继承和方法重写变得容易得多:
'use strict';
class A {
speak() {
console.log("I'm A");
}
}
class B extends A {
speak() {
super.speak();
console.log("I'm B");
}
}
var a = new A();
a.speak();
// Output:
// I'm A
var b = new B();
b.speak();
// Output:
// I'm A
// I'm B
当在继承类中使用时,super
keyword引用父类。此外,父类上的所有方法都绑定到子类的实例,因此您不必编写super.method.apply(this);
。
至于兼容性:the ES6 compatibility table只显示了主要播放器支持类的最新版本(大多数)。火狐浏览器(Chrome和Opera)从今年1月起就有了它们,而使用SpiderMonkey JS引擎的火狐将在下个月的官方Firefox45版本中看到类。在移动方面,安卓仍然不支持这一功能,而五个月前发布的iOS 9已经部分支持。
幸运的是,有一个用于将Harmony代码重新编译为ES5代码的JS库Babel。类以及ES6中的许多其他很酷的特性可以使您的Javascript代码更具可读性和可维护性。
发布于 2011-07-31 05:42:19
Once应该避免模仿经典的OO,而使用原型OO。用于原型OO的一个很好的实用程序库是traits。
与其重写方法和设置继承链(人们应该总是偏爱对象组合而不是对象继承),不如将可重用的函数捆绑到特征中,并使用这些函数创建对象。
var modifyA = {
modify: function() {
this.x = 300;
this.y = 400;
}
};
var modifyB = {
modify: function() {
this.x = 3000;
this.y = 4000;
}
};
C = function(trait) {
var o = Object.create(Object.prototype, Trait(trait));
o.modify();
console.log("sum : " + (o.x + o.y));
return o;
}
//C(modifyA);
C(modifyB);
发布于 2011-07-31 03:20:39
您的示例中的modify()是一个私有函数,它只能在A、B或C定义中才能从任何地方访问。您需要将其声明为
this.modify = function(){}
C没有对它的父类的引用,除非你把它传递给C。如果C被设置为从A或B继承,它将继承它的公共方法(而不是你定义的modify()那样的私有函数)。一旦C从其父对象继承了方法,您就可以重写继承的方法。
https://stackoverflow.com/questions/6885404
复制相似问题