首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JavaScript中使原始数据类型只读/非nonConfig

在JavaScript中使原始数据类型只读/非nonConfig
EN

Stack Overflow用户
提问于 2011-06-18 12:57:51
回答 4查看 487关注 0票数 2

有没有人有使单个对象道具成为只读/不可配置的示例实现?我是说原始数据类型。曾经尝试过使用ES5对象API,但是碰到了砖墙。

我不能显示代码,因为它仍然处于“混乱”的阶段,但基本上我正在迭代一个外部对象,它本身包含数字对象。这些对象都包含不同的原始数据类型。我已经做了外部对象readOnly,非配置等,但不知道如何为单个道具,最里面的道具做同样的事情。

所以,如果是outer.inner.prop === "Hello",我想让这个值readOnly

谢谢!

更新

我刚刚搞清楚了,这都在我用来迭代道具的for循环中。现在,我实际上已经得到了道具的数据描述符,甚至是原始的。))谢谢大家!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-18 13:11:34

您必须遍历内部对象,因为无法使用标准的ES5方法对对象进行深度冻结。

代码语言:javascript
运行
复制
function deepFreeze(obj) {
    Object.keys(obj).forEach(function (key) {
        if (typeof obj[key] == 'object')
            deepFreeze(obj[key]);
    });
    Object.freeze(obj);
}

编辑:如果你不想要freeze也为defineProperty工作

代码语言:javascript
运行
复制
function deepWriteProtect(obj) {
    Object.keys(obj).forEach(function (key) {
        if (typeof obj[key] == 'object')
            deepWriteProtect(obj[key]);
        Object.defineProperty(obj, key, { writable: false });
    });
}
票数 2
EN

Stack Overflow用户

发布于 2011-06-18 13:10:25

我不是百分之百肯定我正确理解了你的问题,但是从我所收集到的信息来看,你要求的是私人变量。如果是这样的话,可以很容易地使用闭包来实现这一点。

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2011-06-18 13:12:04

下面的(ES5)示例会有所帮助吗?它创建一个空构造函数,带有属性a的getter (没有设置器,因此只读取事实上的a ):

代码语言:javascript
运行
复制
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你可以做到

代码语言:javascript
运行
复制
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可以被覆盖。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6396175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档