我宣告myDictionary為一個由用戶填充的物件(鍵/值)
但是對于防御性編程,我想確保用戶是否將其__proto__作為字典物件的鍵,其值為"some value",他/她將能夠使用它,但正如您所知,在呼叫myDictionary.__proto__物件原型時將呼叫 setter/getter。
我為此找到的一種解決方案是將物件創建null為原型,因此__proto__其原型中將沒有 setter/getter。但問題是你也不會擁有其他物件的方法。
我很想看看這里是否有人可以解決這個問題(有什么方法可以在保存性能的同時填充 Object 方法?)
他們試圖將 定義__proto__為字典中的鍵。
let myDictionary = {};
let key = prompt("What's the key?", "__proto__");
myDictionary [key] = "some value";
alert(myDictionary [key]); // [object Object], not "some value"!
通過創建物件null作為原型來解決問題:
let myDictionary = Object.create(null);
let key = prompt("What's the key?", "__proto__");
myDictionary[key] = "some value";
alert(myDictionary[key]); // "some value"
或者有沒有辦法用__proto__鍵分配屬性而不會弄亂物件原型的getter/setter?
uj5u.com熱心網友回復:
您可以使用代理來隱藏物件中不需要的屬性。
由于您希望某些屬性具有自定義值,因此可以提供這些屬性的映射(物件不起作用)。該createObject函式的回傳將是一個新物件,它檢查每個鍵并根據提供的已定義鍵映射檢查它。這樣,您基本上可以在物件上擁有自定義屬性,而不會犧牲其原型方法,例如toString().
此行為的實作或使用接受物件的每次查找的 getter 的 Proxy 完成,在 getter 內攔截訪問的屬性,如果已定義,則回傳該值,否則回傳正常值。
function protectedObject(target = {}, definedKeys = new Map()) {
const handler = {
get(target, prop) {
if (definedKeys.has(prop)) return definedKeys.get(prop);
return target[prop];
}
};
return new Proxy(target, handler);
}
const obj = protectedObject({
test: 123
}, new Map([
["__proto__", "some value"]
]));
console.log(obj.test);
console.log(obj.__proto__);
console.log(obj.toString());
alert(obj[prompt("What's the key?", "__proto__")]);
所有Object.prototype方法都是完整的,因為這會創建一個真實的物件(只是代理)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/466394.html
標籤:javascript 目的 特性 原型
