在没有Object.defineProperty的情况下定义不可写属性?

时间:2015-06-25 21:44:08

标签: javascript ecmascript-5

所以我知道你可以这样做:

var obj = {};
Object.defineProperty(obj, 'staticProp', {
    value: 'I will never change',
    writable: 'false'
});

我知道你可以这样做:

var obj = {
    get gettableProp(){
        return 'gettable!'
    }
} 

有没有办法以声明方式定义不可写/可枚举/可配置的属性,而不是使用Object.defineProperty(),你定义一个getter或setter的方式?

我问的原因是因为我有一个传递像这样的对象的函数:

ObjectProcessor({
    // A bunch of properties
})

我真的希望能够在我想要包含不可写或不可枚举的属性时保留这种简单的语法,而不是必须这样做

var obj = {}
Object.defineProperty(obj, 'staticProp', {
    value: 'I will never change',
    writable: 'false'
});
ObjectProcessor(obj);

3 个答案:

答案 0 :(得分:4)

  

有没有办法以声明方式定义不可写/可枚举/可配置属性,而不是使用Object.defineProperty(),你定义一个getter或setter的方式?

没有

(有Object.defineProperties,但我想这不是你要找的东西)

答案 1 :(得分:1)

不,没有其他方法(Object.definePropertiesObject.create除外,它们允许您提供多个这些描述符)。

  

我真的希望能够保持这种简单的语法

请注意Object.defineProperty返回传递的对象,因此您可以将代码简化为

ObjectProcessor(Object.defineProperty({}, 'staticProp', {
    value: 'I will never change',
    writable: 'false'
}));

并避免引入额外的obj变量。

答案 2 :(得分:0)

使用命名约定,您可以将其构建到ObjectProcessor中:

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/js/bootstrap.min.js"></script>

这使您可以处理可写和只读属性:

var prefix = 'readonly_';

function ObjectProcessor(obj) {
    Object.keys(obj).filter(function (name) {
        // find property names which match your convention
        return name.indexOf(prefix) === 0;
    }).forEach(function (name) {
        // make the new property readonly
        Object.defineProperty(obj, name.substring(prefix.length), {
            value: obj[name],
            writable: false
        });

        // remove the old, convention-named property
        delete obj[name];
    });

    // remaining ObjectProcessor logic...
}