所以我知道你可以这样做:
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);
答案 0 :(得分:4)
有没有办法以声明方式定义不可写/可枚举/可配置属性,而不是使用Object.defineProperty(),你定义一个getter或setter的方式?
没有
(有Object.defineProperties
,但我想这不是你要找的东西)
答案 1 :(得分:1)
不,没有其他方法(Object.defineProperties
和Object.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...
}