使用闭包创建私有属性 javascript

using closure to make private properties javascript

我在代码大战中有这个提示

“javascript 对象上没有私有属性这样的东西!但是,也许有?

实现一个函数 createSecretHolder(secret),它接受任何值作为秘密,returns 一个只有两个方法的对象

我很确定它要我使用闭包来实现这一点,我已经阅读了如何在此处执行此操作:

Private variables and closures

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 的值,并且主要遵循我上面列出的来源中的示例。如何创建一个只有两种方法来获取和设置数据的闭包,以及在不添加其他属性的情况下将 secret 的值存储在哪里?

问题是 return 关键字实际上 returns 具有您未遵循的结构的对象。 试试这个:

function createSecretHolder() {
  var _secret = secret;
return {

    getSecret : function(){
      return _secret;
    }
,
    setSecret : function(secret){
      _secret = secret;
    }
  }
}

您正在尝试 return 一个对象文字,其中您不能有赋值语句。要使用闭包 属性,您需要将变量存储在函数作用域中,如下所示

function createSecretHolder(secret) {
    var _secret = secret;

    return {
        getSecret: function() {
            return _secret;
        },

        setSecret: function(secret) {
            _secret = secret;
        }
    }
}

现在,由于闭包 属性,_secretgetSecretsetSecret 函数的范围内。这样他们就可以访问它了。

使用_前缀一个属性是一个通用的命名约定JavaScript开发人员遵循以表明属性不应该被改变的意图,它肯定与此有关提示,但似乎并没有暗示它是必需的,而且可能不需要专门针对此挑战。

您看到的 SyntaxError 与 _secret 初始化在对象文字内而不是在外部有关。对象字面量语法不同于变量声明和赋值,应该混合使用。您可以将 var _secret = secret; 移动到 return 语句之外和之前(但仍在函数 createSecretHolder 之内)。 (超级大黄蜂是对的,但他的代码缺少 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'