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

Defining non-writable properties without Object.defineProperty?

所以我知道你可以做到这一点:

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

我知道你可以做到:

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

有没有办法以声明方式定义 non-writable/enumerable/configurable 属性,而不是像定义 getter 或 setter 那样使用 Object.defineProperty()?

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

ObjectProcessor({
    // A bunch of properties
})

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

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

Is there a way to define non-writable/enumerable/configurable properties declaratively instead of using Object.defineProperty(), the way you'd define a getter or setter?

没有

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

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

I'd really like to be able to keep that simple syntax

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

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

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

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

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...
}

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

ObjectProcessor({
    readonly_id: 1,
    name: 'Foo'
});