[英]using closure to make private properties javascript
我有關於代碼戰爭的提示
“javascript對象上沒有私有屬性這樣的東西!但是,也許有?
實現一個函數 createSecretHolder(secret),它接受任何值作為秘密並返回一個只有兩種方法的對象”
我很確定它希望我使用閉包來實現這一點,我已經在此處閱讀了有關如何執行此操作的信息:
https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Contributor_s_Guide/Private_Properties
這是我的代碼:
function createSecretHolder(secret) {
return {
var _secret = secret;
this.getSecret = function(){
return _secret;
}
this.setSecret = function(secret){
_secret = secret;
}
}
}
但是,我收到此錯誤:
[eval]:6
var _secret = secret;
^
SyntaxError: Unexpected token =
at Object. ([eval]-wrapper:6:22)
at
at evalScript (node.js:536:25)
at startup (node.js:80:7)
at node.js:906:3
我嘗試創建一個帶有私有值的對象文字來保存 secret 的值,並且主要遵循我上面列出的來源中的示例。 如何僅使用兩種方法創建閉包來獲取和設置數據,以及在不添加其他屬性的情況下存儲秘密值的位置?
您正在嘗試返回對象文字,在該文字中不能有賦值語句。 要具有閉包屬性,您需要將變量存儲在函數范圍內,如下所示
function createSecretHolder(secret) {
var _secret = secret;
return {
getSecret: function() {
return _secret;
},
setSecret: function(secret) {
_secret = secret;
}
}
}
現在,由於閉包屬性, _secret
在getSecret
和setSecret
函數的范圍內。 這樣他們就可以訪問它。
問題是return
關鍵字實際上返回具有您未遵循的結構的對象。 嘗試這個:
function createSecretHolder() {
var _secret = secret;
return {
getSecret : function(){
return _secret;
}
,
setSecret : function(secret){
_secret = secret;
}
}
}
使用 _ 來添加屬性是 JavaScript 開發人員遵循的常見命名約定,以表明不應更改該屬性的意圖,這肯定與此提示有關,但似乎並未暗示需要它,也可能不需要需要專門針對這一挑戰。
您看到的 SyntaxError 與 _secret 初始化在對象文字內而不是在外部有關。 對象字面量語法與變量聲明和賦值不同,應該混合使用。 你可以移動var _secret = secret;
在 return 語句的外部和之前(但仍在函數 createSecretHolder 內部)。 (Super Hornet 是對的,但他的代碼缺少secret
參數,所以他的代碼會得到一個 Reference 錯誤,說 secret 未定義。)雖然您的嘗試更具聲明性,但實際上您可以不用const _secret = secret
。 該函數所做的第一件事是將其參數與其參數配對,在這種情況下,聲明秘密並將輸入分配給它。 所以它已經“關閉”了。
這是我的看法,它的工作原理幾乎相同,只是我喜歡將 console.log() 包含到我希望看到結果的函數中。
function createSecretHolder(secret) {
// input: secret
// output: object (with only 2 methods)
return {
getSecret() { console.log(secret) },
setSecret(input) { secret = input }
}
}
const obj1 = createSecretHolder(5);
obj1.getSecret() // => 5
obj1.setSecret(2)
obj1.getSecret() // => 2
與...一樣:
function createSecretHolder2(secret) {
return {
getSecret() { return secret },
setSecret(input) { secret = input }
}
}
const obj2 = createSecretHolder2(91);
console.log(obj2.getSecret()) // => 91
console.log(obj2.setSecret(82)) // => undefined
obj2.setSecret('new Secret') // logs nothing, returns undefined
obj2.getSecret() // logs nothing, returns 'new Secret'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.