首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript重写方法

JavaScript重写方法
EN

Stack Overflow用户
提问于 2011-07-31 03:09:07
回答 5查看 166.6K关注 0票数 93

假设您有以下代码:

代码语言:javascript
复制
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));
}

现在的问题是,是否有任何方法可以用AB中的方法覆盖C中的modify方法。在Java语言中,您可以使用super-keyword,但是在JavaScript中如何实现这样的功能呢?

EN

回答 5

Stack Overflow用户

发布于 2016-03-02 05:56:00

由于这是谷歌上的热门话题,我想给出一个最新的答案。

使用ES6 classes使得继承和方法重写变得容易得多:

代码语言:javascript
复制
'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代码更具可读性和可维护性。

票数 86
EN

Stack Overflow用户

发布于 2011-07-31 05:42:19

Once应该避免模仿经典的OO,而使用原型OO。用于原型OO的一个很好的实用程序库是traits

与其重写方法和设置继承链(人们应该总是偏爱对象组合而不是对象继承),不如将可重用的函数捆绑到特征中,并使用这些函数创建对象。

Live Example

代码语言:javascript
复制
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);
票数 5
EN

Stack Overflow用户

发布于 2011-07-31 03:20:39

您的示例中的modify()是一个私有函数,它只能在A、B或C定义中才能从任何地方访问。您需要将其声明为

代码语言:javascript
复制
this.modify = function(){}

C没有对它的父类的引用,除非你把它传递给C。如果C被设置为从A或B继承,它将继承它的公共方法(而不是你定义的modify()那样的私有函数)。一旦C从其父对象继承了方法,您就可以重写继承的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6885404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档