【问题标题】:Syntax for "extending" Prototype in ECMAScript 6ECMAScript 6 中“扩展”原型的语法
【发布时间】:2016-08-13 22:32:58
【问题描述】:

由于 ECMAScript 6 中的类只是 JavaScript 现有的基于原型的继承的语法糖,仍然可以使用 EMCAScript 5 语法“扩展”(因为没有更好的词)现有类的原型并添加方法到它甚至在一个完全独立的文件中的类声明之后。

/* Dog.js */

class Dog {
    woof() {
        console.log('woof woof');
    }
}

module.exports = Dog;

/* main.js */

var Dog = require('./Dog');

Dog.prototype.bark = function() {
    console.log('bark bark');
};

var dog = new Dog();
dog.woof(); // 'woof woof'
dog.bark(); // 'bark bark'

有没有办法实现与上述相同的功能,但在 main.js 中保持 ECMAScript 6 类语法,而不是回到原型语法?尝试诸如 class Dog extends Dog 之类的操作会引发错误,因为 Dog 类已被声明。

请注意,这不是继承意义上的扩展,因为这需要创建一个新类,而不是向现有类添加方法。

class Dog {
    woof() {
        console.log('woof woof');
    }
}

class AdvancedDog extends Dog {
    bark() {
        console.log('bark bark');
    }
}

var dog = new Dog();
dog.woof(); // 'woof woof'
dog.bark(); // Error, not what is needed.

【问题讨论】:

  • 并非如此。 extends 表示新类将继承旧类的所有内容,它不会使用新属性扩展旧类。为此,您必须使用新属性“扩展”对象或原型。

标签: javascript syntax ecmascript-6


【解决方案1】:

extends 的语义是原型继承,而想要的行为是原型修改。这不是日常任务,也不是 ES6 中具有特殊语法的东西。

可以这样做

Object.assign(Dog.prototype, {
    bark() {
        console.log('bark bark');
    }
});

请注意,对象字面量中的bark 方法是可枚举的,而ES6 class methods are non-enumerable。如果此 trait 很重要,则应额外使用 Object.defineProperty

【讨论】:

    【解决方案2】:

    不,没有办法做你想做的事。

    一个类不能在多个文件中部分声明。

    顺便说一句,您应该能够使用诸如 Grunt 或 Gulp 之类的任务运行器并实现一个任务来合并多个声明相同文件的文件,从而生成一个文件,其中包含来自其他文件的单个类声明。

    也许这也可以作为Babel 插件实现。

    【讨论】:

      猜你喜欢
      • 2015-08-16
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 2012-11-16
      • 2016-09-14
      相关资源
      最近更新 更多