JavaScript重写方法

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

假设您有以下代码:

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));
}

现在的问题是,如果有什么方法可以modify用C和A和B中的方法重写方法。在Java中,您可以使用super关键字,但是如何在JavaScript中实现类似的功能呢?

提问于
用户回答回答于

编辑:现在已经六年了,原来的答案已经写好了,而且很多已经改变了!

  • 如果您使用的是更新版本的JavaScript,可能使用Babel这样的工具进行编译,那么您可以使用真实的类
  • 如果您使用的是AngularReact提供的类组件构造函数,那么您需要查看该框架的文档。
  • 如果您使用ES5并通过原型手工制作“假”类,下面的答案仍然是正确的。

祝你好运!

JavaScript继承看起来与Java有点不同。以下是本机JavaScript对象系统的外观:

// Create a class
function Vehicle(color){
  this.color = color;
}

// Add an instance method
Vehicle.prototype.go = function(){
  return "Underway in " + this.color;
}

// Add a second class
function Car(color){
  this.color = color;
}

// And declare it is a subclass of the first
Car.prototype = new Vehicle();

// Override the instance method
Car.prototype.go = function(){
  return Vehicle.prototype.go.call(this) + " car"
}

// Create some instances and see the overridden behavior.
var v = new Vehicle("blue");
v.go() // "Underway in blue"

var c = new Car("red");
c.go() // "Underway in red car"

不幸的是,这有点难看,它不包含一个非常好的方法来“超级”:你必须手动指定你想调用哪个父类的方法。因此,有很多工具可以使创建类更好。试着看看Prototype.js,Backbone.js或类似的库,其中包含用于在js中执行OOP的更好的语法。

用户回答回答于

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

使用ES6类使继承和方法更容易重写:

'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关键字在继承类使用时指的是父类。此外,父类的所有方法都绑定到子实例,所以您不必写super.method.apply(this);

至于兼容性:ES6兼容性表格仅显示主要玩家支持类(主要)的最新版本。V8浏览器从今年1月份开始使用(Chrome和Opera),使用SpiderMonkey JS引擎的Firefox将于下个月发布其官方Firefox 45版本。在手机方面,Android仍然不支持这项功能,而5个月前发布的iOS 9则有部分支持。

Babel是一个JS库,用于将Harmony代码重新编译为ES5代码。ES6中的类和其他许多很酷的功能可以使您的Javascript代码更具可读性和可维护性。

扫码关注云+社区