Pro*_*ofK 2 javascript ecmascript-5 revealing-module-pattern
我的揭示模块中有以下代码,但我不确定如何声明/定义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();
}
}
})();
Run Code Online (Sandbox Code Playgroud)
使用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
}
Run Code Online (Sandbox Code Playgroud)
我不想要这个:
// Now any changes will fail
function fail(){
'use strict';
obj.foo = 'sparky'; // throws a TypeError
}
Run Code Online (Sandbox Code Playgroud)
你看?我想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
})();
Run Code Online (Sandbox Code Playgroud)
现在,谈论您的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);
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |