如何创建固定结构的对象
How can I create an object of fixed structure?
我的揭示模块中有以下代码,但我不确定如何声明/定义imageListItem
,这严格来说是一个 DTO,实际上不需要任何信息隐藏。我是否正确定义了此对象?
var imageListItem = function() {
var _title;
Object.defineProperty(this, "title", {
get: function () { return _title; },
set: function (value) { _title = value; }
}
);
};
var imageList = (function () {
var buffer = new CBuffer();
return {
populate: function (listItems) {
buffer.push(listItems);
},
rotate: function() {
buffer.rotateLeft();
}
}
})();
对于imageListItem
,我想声明一个对象结构供以后使用。该声明在逻辑上不应依赖于以后如何使用该对象。也就是说,我不想发现自己意外地动态地为imageListItem
分配新属性或删除属性。对属性的任何赋值都应严格限于已在对象上声明的属性。
Object.freeze()
通过阻止添加或删除属性几乎可以解决这个问题,但它也可以防止更改属性。
例如,我想要这个:
var obj = {
prop: function() {},
foo: 'bar'
};
// New properties may be added, existing properties may be changed or removed
obj.foo = 'baz';
obj.lumpy = 'woof';
var o = Object.freeze(obj);
// Now any changes will fail
function fail(){
'use strict';
obj.delete(foo); // throws a TypeError
obj.quaxxor = 'the friendly duck'; // throws a TypeError
}
我不想要这个:
// Now any changes will fail
function fail(){
'use strict';
obj.foo = 'sparky'; // throws a TypeError
}
你看?我希望freeze
阻止quaxxor
被添加到obj
,但我不希望它阻止我更改foo
的值。
您要查找的内容可能是Object.preventExtensions()
或Object.seal()
。
与Object.freeze()
类似,这两种方法都阻止将新属性添加到对象中,但仍允许更改现有属性的值。
seal
和 preventExtensions
之间的区别在于,seal
严格禁止从/向数据访问器删除属性,而preventExtensions
实际上并不阻止删除现有属性:此行为取决于您使用的 JS 引擎(某些引擎可能允许您删除属性,其他引擎可能不允许(。
所以基本上,引用MDN文档:
Object.preventExtensions()
方法可防止将新属性添加到对象中(即防止将来对对象进行扩展(。[...]请注意,通常仍可以删除非可扩展对象的属性。
Object.seal()
方法密封对象,防止向对象添加新属性,并将所有现有属性标记为不可配置。只要当前属性的值是可写的,它们仍然可以更改。[...]尝试删除或向密封对象添加属性,或者将数据属性转换为访问器,反之亦然,将失败。
下面是演示这两种方法行为的示例:
var myFirstObj = { foo: 1 },
mySecondObj = { bar: "baz" };
Object.preventExtensions(myFirstObj);
Object.seal(mySecondObj);
myFirstObj.foo = false; // Works fine
mySecondObj.baz = "hello"; // Works fine
delete myFirstObj.foo; // May work fine depending on your JS engine
(function() {
'use strict';
myFirstObj.qux = 'something'; // Throws a TypeError
mySecondObj.qux = 'something'; // Throws a TypeError
delete mySecondObj.foo; // Throws a TypeError
})();
<小时 />现在,谈论您的ImageListItem
对象,您只需添加一行代码即可实现您想要的目标:
var ImageListItem = function() {
var _title;
Object.defineProperty(this, "title", {
get: function () { return _title; },
set: function (value) { _title = value; }
});
// Choose the one which fits your needs
Object.preventExtensions(this);
// or
Object.seal(this);
};
- 更改JSON对象的结构
- 嵌套对象结构
- 从json对象聚集数据并创建层次结构
- 如何迭代json对象结构以只获取名称
- ES6非结构化中的计算属性-非结构化整体对象
- 如何在Javascript中连接两个结构不同的对象
- redux 中状态对象的结构
- 文字与原型对象表示法的数据结构
- 从knockout.js中的另一个对象更新一个深度结构化的javascript对象
- JSDoc:返回对象结构
- 通过键将平面对象转换为嵌套结构
- 关于JavaScript对象结构属性的问题
- 如何用以下结构定义一个空的javascript对象,以便我可以动态地将数据插入其中
- 无法识别的数据结构-转换为对象
- 无法通过jQuery查找来定位层次结构中的对象
- Rails结构到JSON对象
- 将字符串(带有结构对象)转换为对象
- 从HTML大纲创建层次结构对象
- 特殊的JavaScript结构:对象定义中的对象类型变量
- Null在Javascript中检查大型层次结构对象