[英]Making primitive data types readOnly/nonConfig in JavaScript
有没有人有任何使单个对象道具变为只读/不可配置的示例实现? 我的意思是原始数据类型。 曾尝试使用ES5 Object API,但遇到了麻烦。
我无法显示代码,因为它仍处于“混乱”阶段,但是基本上,我正在遍历一个外部对象,该对象本身包含多个对象。 这些对象每个都拥有各种原始数据类型。 我已经将外部对象设置为readOnly,non-config等,但是无法弄清楚如何对单个道具(最里面的道具)做同样的事情。
因此,如果outer.inner.prop === "Hello"
,我想将该值设置为readOnly
。
谢谢!
UPDATE
我只是想出了这一点,这一切都在我用于遍历道具的for循环中。 现在,我实际上已经获得了道具的数据描述符,甚至是原始的。 :)谢谢大家!
您必须遍历内部对象,因为无法使用标准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 });
});
}
我不确定100%是否正确理解了您的问题,但是从我收集到的信息中,您正在请求私有变量。 如果是这样,可以使用闭包轻松实现。
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
以下(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
可以被覆盖。
这是一个jsfiddle,显示了如何使用ES5的getter / setter定义来使对象的属性只能被获取。 代码如下:
var object = {
get x() {
return 17;
}, set x() {
alert("You cannot set x!");
}
};
当然,getter可以从任何地方获取属性(“ x”)的值,例如构造函数的闭包之类。 关键是设置器根本不会更改值,因此会尝试更改它:
object.x = 100;
不会有任何效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.