javascript - ECMAScript 6 中 "extending"原型(prototype)的语法

标签 javascript syntax ecmascript-6

由于 ECMAScript 6 中的类只是 JavaScript 现有基于原型(prototype)的继承的语法糖,因此仍然可以使用 EMCAScript 5 语法“扩展”(由于缺乏更好的词)现有类的原型(prototype),并将方法添加到即使在完全独立的文件中的类声明之后也是如此。

/* 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 类语法,而不是回到原型(prototype)语法?尝试诸如 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 的语义是原型(prototype)继承,而所需的行为是原型(prototype)修改。这不是一个日常任务,也不是 ES6 中具有特殊语法的东西。

可以通过以下方式做到这一点

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

请注意,对象文字中的 bark 方法是可枚举的,而 ES6 class methods are non-enumerable 。如果此特征至关重要,则应另外使用 Object.defineProperty

关于javascript - ECMAScript 6 中 "extending"原型(prototype)的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38937543/

相关文章:

javascript - jQuery - 更新仅适用于众多字段之一

javascript - 文件读取器 API 'load' 事件

javascript - 简单的浏览器对称 AES 加密

c++ - C++中的未知变量声明语法

python - 为什么当我正确缩进打印行时终端中出现语法错误消息,但当我缩进它时程序运行并打印输出 33 次?

javascript - React router 4查询参数示例不起作用

javascript - 正则表达式组与空格匹配

c# - C# 中的 Sql Parser 用于语法检查 Oracle 语句

javascript - Material UI v1 with Redux - 如何导出

javascript - Vue.js 2.0 : ES6 export from main. js(webpack 入口点)?