繁体   English   中英

在JavaScript中将原始数据类型设置为readOnly / nonConfig

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM