【问题标题】:Property descriptors in ES6 classesES6 类中的属性描述符
【发布时间】:2019-01-27 12:24:56
【问题描述】:

如何将以下代码转换为 ES6 类:

var Mergesort = (function() {
    function Mergesort(){}
    Object.define(Mergesort.prototype,'readOnlyMethod',{
        value:function(){/*DO SOMETHING, RETURN SOME VAL*/},
        configurable:false,
        writable:false,
        enumerable:false
    });
    return Mergesort;
})()

【问题讨论】:

  • 为什么不保留该代码?
  • 这主要是一种常规方法,除了writable: false, configurable: false。你真的需要那个吗? (如果是这样,它与 ES6 的类的 prototype 和函数的 prototype 的工作方式完全相同。)
  • 应该是Object.defineProperty
  • @TomasKatz 这通常不被视为“设计模式”。请解释你编写这种不常见的 ES5 代码的动机,以便我们可以建议使用 class 语法的解决方案,以保持对这个想法的忠诚。
  • 别无礼。请务必理解澄清请求,如果您想要一个可能更准确的答案,请依次回答。

标签: javascript ecmascript-6 ecmascript-5


【解决方案1】:

字面的 ES6 翻译应该是

const Mergesort = (() => {
    class Mergesort {}
    Object.defineProperty(Mergesort.prototype, 'readOnlyMethod', {
        value() { /*DO SOMETHING, RETURN SOME VAL*/ },
        configurable: false,
        writable: false,
        enumerable: false
    });
    return Mergesort;
})();

但假设您想将方法定义为class 表达式的一部分,只需在之后更改属性描述符:

class Mergesort {
    readOnlyMethod() { /*DO SOMETHING, RETURN SOME VAL*/ }
}
Object.defineProperty(Mergesort.prototype, 'readOnlyMethod', {configurable:false, writable:false});

【讨论】:

  • 哇,我不知道 defineProperty 在属性已经存在时这样做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多