有没有人有使单个对象道具成为只读/不可配置的示例实现?我是说原始数据类型。曾经尝试过使用ES5对象API,但是碰到了砖墙。
我不能显示代码,因为它仍然处于“混乱”的阶段,但基本上我正在迭代一个外部对象,它本身包含数字对象。这些对象都包含不同的原始数据类型。我已经做了外部对象readOnly,非配置等,但不知道如何为单个道具,最里面的道具做同样的事情。
所以,如果是outer.inner.prop === "Hello"
,我想让这个值readOnly
。
谢谢!
更新
我刚刚搞清楚了,这都在我用来迭代道具的for循环中。现在,我实际上已经得到了道具的数据描述符,甚至是原始的。))谢谢大家!
发布于 2011-06-18 13:11:34
您必须遍历内部对象,因为无法使用标准的ES5方法对对象进行深度冻结。
function deepFreeze(obj) {
Object.keys(obj).forEach(function (key) {
if (typeof obj[key] == 'object')
deepFreeze(obj[key]);
});
Object.freeze(obj);
}
编辑:如果你不想要freeze
,也为defineProperty
工作
function deepWriteProtect(obj) {
Object.keys(obj).forEach(function (key) {
if (typeof obj[key] == 'object')
deepWriteProtect(obj[key]);
Object.defineProperty(obj, key, { writable: false });
});
}
发布于 2011-06-18 13:10:25
我不是百分之百肯定我正确理解了你的问题,但是从我所收集到的信息来看,你要求的是私人变量。如果是这样的话,可以很容易地使用闭包来实现这一点。
function myClass(){
var mySecretProperty = 10;
this.getMySecretProperty = function(){
return mySecretProperty;
}
this.changeMySecretProperty = function(s){
// whatever logic you need for a setter method
mySecretProperty = s;
}
}
var myObj = new MyClass();
myObj.changeMySecretProperty(120);
myObj.getMySecretProperty(); // will return 120
myObj.mySecretProperty // will return undefined
发布于 2011-06-18 13:12:04
下面的(ES5)示例会有所帮助吗?它创建一个空构造函数,带有属性a
的getter (没有设置器,因此只读取事实上的a
):
var Obj = function(){};
Obj.prototype = {
get a() {return 5;}
}
var x = new Obj;
alert(x.a); //=> 5
x.a = 6; //=> TypeError: setting a property that has only a getter
不使用ES5你可以做到
var Obj = function(){
var a = 5;
if (!Obj.prototype.getA) {
Obj.prototype.getA = {
toString: function() {
return a;
}
};
}
}
var y = new Obj;
alert(y.getA); //=> 5
但这并不是100%的故障安全:Obj.prototype.getA
可以被覆盖。
https://stackoverflow.com/questions/6396175
复制相似问题