![](/img/trans.png)
[英]Variables cannot be exported with Object.defineProperty in Javascript
[英]Is there an analogue to Object.defineProperty to define variables?
通過您導出的模塊的公共方法訪問私有變量很容易:
var makeAModule = function() {
var _secret = 'Ssh!';
var module = {
tellMeYourSecret: function() {
console.log(_secret);
}
};
return module;
}
// > var m = makeAModule();
// > m.tellMeYourSecret();
// Ssh!
有時我需要使用Object.defineProperty定義屬性,這些屬性由getter使用其他私有變量的值計算。 但是,那些必須繼續使用一個對象,所以我最終制作了一個私有對象來保存它們。 如果我不將所有私人成員存儲在該對象上,那么記住哪些道具在哪個道具上以及哪些不在道具上會讓人感到困惑,所以我把所有內容放在那里:
var makeAModule = function() {
var priv = {};
priv._secret = 'Ssh!';
Object.defineProperty(priv, 'secretLength', {
get: function() {
return priv._secret.length;
}
});
var module = {
tellMeYourSecret: function() {
console.log(priv._secret);
},
howLongIsYourSecret: function() {
console.log(priv._secretLength);
}
}
return module;
}
// > var m = makeAModule();
// > m.howLongIsYourSecret();
// 4
有沒有辦法定義一個變量(沒有附加到對象),其值是通過getter計算的? 像這樣的東西:
var makeAModule = function() {
var _secret = 'Ssh!';
Object.defineVariable('_secretLength', {
get: function() {
return _secret.length;
}
})
var module = {
tellMeYourSecret: function() {
console.log(_secret);
},
howLongIsYourSecret: function() {
console.log(_secretLength);
}
}
return module;
}
不是直接的。
但是,您可以將其設置為window
的屬性,從而使其成為全局變量。 但是不建議使用全局變量,特別是如果它們是秘密的話。
var makeAModule = function() { var priv = {}; priv._secret = 'Ssh!'; Object.defineProperty(window, '_secretLength', { get: function() { return priv._secret.length; } }); return { tellMeYourSecret: function() { return _secret; }, howLongIsYourSecret: function() { return _secretLength; } }; }; document.body.innerHTML = "Secret length: " + makeAModule().howLongIsYourSecret();
或者,您可以將getter定義為對象的屬性,並使用with
語句 。 請注意, with
語句不能在嚴格模式下使用。
var makeAModule = function() { var priv = {}; priv._secret = 'Ssh!'; Object.defineProperty(priv, '_secretLength', { get: function() { return priv._secret.length; } }); with(priv) { return { tellMeYourSecret: function() { return _secret; }, howLongIsYourSecret: function() { return _secretLength; } }; } }; document.body.innerHTML = "Secret length: " + makeAModule().howLongIsYourSecret();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.