【发布时间】:2014-12-13 09:05:03
【问题描述】:
我的显示模块中有以下代码,但我不确定如何声明/定义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 的值。
【问题讨论】:
-
如果您不需要任何信息隐藏(或逻辑),为什么要将其设置为访问器属性?只需使用
this.title = undefined;。 -
(不确定这是否是您要寻找的全部答案)
-
@Bergi,它可能很接近。我只是不知道如何声明一个未初始化的变量。
-
为什么这个属性根本没有初始化?实际创建它们的代码是什么?
-
@Bergi 除了
this.title = undefined或Object.defineProperty之外,没有任何东西可以创建它们。这就是我的问题的重点——如何声明它们。
标签: javascript ecmascript-5 revealing-module-pattern