簡體   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