簡體   English   中英

使用閉包創建私有屬性 javascript

[英]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;
        }
    }
}

現在,由於閉包屬性, _secretgetSecretsetSecret函數的范圍內。 這樣他們就可以訪問它。

問題是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM