首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用defineProperty定义getter

使用defineProperty定义getter
EN

Stack Overflow用户
提问于 2020-12-29 11:17:23
回答 1查看 67关注 0票数 2

在我们的应用程序中,我们使用JavaScript压缩我们的UglifyJS类,它不支持在返回Unexpected token: operator (=)时压缩像onBlur = (event) => {}这样的语法。

为了解决这个问题,我们使用了以下函数来定义它们:

代码语言:javascript
复制
function _defineProperty(obj, key, value) {
    if (key in obj) {
        Object.defineProperty(obj, key, {
            value: value,
            enumerable: true,
            configurable: true,
            writable: true
        });
    } else {
        obj[key] = value;
    }
    return obj;
}

然后在构造函数中使用它,如下所示:

代码语言:javascript
复制
class OurClass {
    constructor(...args) {
        super(...args);
            _defineProperty(this, "onBlur", event => {
     
            });
    }
}

效果很好!但是,它不适用于定义getter:

代码语言:javascript
复制
static get values() {
    return { index: Number }
}

就像这样:

代码语言:javascript
复制
_defineProperty(this, 'values', () => {
    return { index: Number };
});

getter从未定义过,在类的其他部分中也是不可访问的,就像我们能够定义其他方法一样.

如何使用defineProperty使用相同的函数定义getter?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-29 11:41:53

Object.defineProperty为其第三个参数接受两种不同的格式:

  • 数据描述符,您目前使用
  • 访问器描述符,它允许定义getter/setter

因此,例如,您可以使用一个可选参数扩展您自己的_defineProperty函数,以指示getter/setter的意图:

代码语言:javascript
复制
function _defineProperty(obj, key, value, accessor) {
    if (accessor == "getter") {
        Object.defineProperty(obj, key, {
            get: value,
            enumerable: true,
            configurable: true,
        });
    } else if (key in obj) {
        Object.defineProperty(obj, key, {
            value: value,
            enumerable: true,
            configurable: true,
            writable: true
        });
    } else {
        obj[key] = value;
    }
    return obj;
}

// simple demo
class MyClass {
    constructor() {
        _defineProperty(this, "num", () => 3, "getter");
    }
}

console.log(new MyClass().num);

如果您希望它是一个静态方法,那么在类(即构造函数上)上定义它:

代码语言:javascript
复制
function _defineProperty(obj, key, value, accessor) {
    if (accessor == "getter") {
        Object.defineProperty(obj, key, {
            get: value,
            enumerable: true,
            configurable: true,
        });
    } else if (key in obj) {
        Object.defineProperty(obj, key, {
            value: value,
            enumerable: true,
            configurable: true,
            writable: true
        });
    } else {
        obj[key] = value;
    }
    return obj;
}

// simple demo
class MyClass {}
_defineProperty(MyClass, "num", () => 3, "getter");

console.log(MyClass.num);

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65491273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档