"Enhance" ECMAScript 2017 (Firefox v55) 中的现有 JS class?
"Enhance" existing JS class in ECMAScript 2017 (Firefox v55)?
基本上我想知道是否可以在 class 级别而不是实例级别重新定义方法,如 here.
所寻求的
另外,为了清楚起见,我希望能够从 enhanced/replacement 方法中调用原始方法(在 this
上)。
我尝试实现所选的答案,"decorating the constructor",但它似乎在 FF55 的 "SpiderMonkey" 版本的 ES2017 中不起作用:我收到一条消息说 class "requires new".
我在谷歌上搜索了一下 this article。这个人谈论了一大堆概念,我什至不知道 Javascript 中存在这些概念!我对 JS 的了解并没有超出 Javascript 权威指南第 6 版,尽管我确实经常使用 Promises
和 async
/await
(我希望新版的 JS Def Guide 总有一天会出来...)。
那么有没有专家知道一种方法,本质上,"enhance"(即重新设计,而不是扩展)ES2017 中现有的 JS classes?
假设您有一个名为 Original
的 class,它有一个要更新的 render
方法。
class Original {
render() {
return 'Original';
}
}
您可以通过更改 Original
函数原型的 render
方法来更新它,如下所示:
Original.prototype.render = function() {
return 'Changed';
}
如果你想为你的 class 添加一个新方法,你可以这样做:
Original.prototype.print = function() {
return 'Printing...';
}
那你就可以照常使用这些方法了
const changed = new Original().render();
const printed = new Original().print();
糟糕...感谢 Dovydas。明明我脑子有问题!
const superObserve = MutationObserver.prototype.observe;
MutationObserver.prototype.observe = function( target, config ){
console.log( 'blip');
superObserve.call( this, target, config );
}
基本上我想知道是否可以在 class 级别而不是实例级别重新定义方法,如 here.
所寻求的另外,为了清楚起见,我希望能够从 enhanced/replacement 方法中调用原始方法(在 this
上)。
我尝试实现所选的答案,"decorating the constructor",但它似乎在 FF55 的 "SpiderMonkey" 版本的 ES2017 中不起作用:我收到一条消息说 class "requires new".
我在谷歌上搜索了一下 this article。这个人谈论了一大堆概念,我什至不知道 Javascript 中存在这些概念!我对 JS 的了解并没有超出 Javascript 权威指南第 6 版,尽管我确实经常使用 Promises
和 async
/await
(我希望新版的 JS Def Guide 总有一天会出来...)。
那么有没有专家知道一种方法,本质上,"enhance"(即重新设计,而不是扩展)ES2017 中现有的 JS classes?
假设您有一个名为 Original
的 class,它有一个要更新的 render
方法。
class Original {
render() {
return 'Original';
}
}
您可以通过更改 Original
函数原型的 render
方法来更新它,如下所示:
Original.prototype.render = function() {
return 'Changed';
}
如果你想为你的 class 添加一个新方法,你可以这样做:
Original.prototype.print = function() {
return 'Printing...';
}
那你就可以照常使用这些方法了
const changed = new Original().render();
const printed = new Original().print();
糟糕...感谢 Dovydas。明明我脑子有问题!
const superObserve = MutationObserver.prototype.observe;
MutationObserver.prototype.observe = function( target, config ){
console.log( 'blip');
superObserve.call( this, target, config );
}