我在揭示模块中有以下代码,但我不确定如何声明/定义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()
通过防止添加或删除属性几乎可以实现这一点,但它也可以防止属性发生变化。
E.g.我想这一点:
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
的值。
如果你不需要任何信息隐藏(或逻辑),为什么你把它作为一个访问器属性?只要使用'this.title = undefined;'。 – Bergi 2014-12-13 12:38:35
(不知道这是你正在寻找的整个答案) – Bergi 2014-12-13 12:39:13
@Bergi,它可能是接近。我只是不知道如何声明一个未初始化的变量。 – ProfK 2014-12-13 13:39:09