使用闭包生成私有属性javascript

使用闭包生成私有属性javascript,javascript,object,properties,Javascript,Object,Properties,我有关于代码战的提示 “javascript对象上没有私有属性!但是,也许有 实现一个函数createSecretHolder(secret),它接受任何值作为secret,并返回一个只有两个方法的对象“ 我很确定它希望我使用闭包来实现这一点,我在这里读到了如何做到这一点: 这是我的代码: function createSecretHolder(secret) { return { var _secret = secret; this.getSecret = functi

我有关于代码战的提示

“javascript对象上没有私有属性!但是,也许有

实现一个函数createSecretHolder(secret),它接受任何值作为secret,并返回一个只有两个方法的对象“

我很确定它希望我使用闭包来实现这一点,我在这里读到了如何做到这一点:

这是我的代码:

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

我尝试使用私有值创建一个object literal来保存secret的值,并且主要遵循上面列出的源代码中的示例。如何仅使用两种方法来获取和设置数据并在何处存储secret的值而不添加其他属性来创建闭包?

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

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

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

您试图返回一个对象文字,其中不能有赋值语句。要拥有closure属性,需要将变量存储在函数作用域中,如下所示

function createSecretHolder(secret) {
    var _secret = secret;

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

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

现在,由于闭包属性,
\u secret
getSecret
setSecret
函数的范围内。所以他们可以访问它。

你需要在对象文本中使用冒号而不是等号。作为建议,最好解释问题是什么(以及解决方案),而不是仅仅发布一个未记录的代码块作为答案。同样的事情是否适用于_secret:secret in the object literal?MDN说下划线只是一种编码约定,并不是语言强制的。没有任何东西可以阻止任何人直接访问“U secret”,因此我不理解它所提供的隐私/保护。@user137717因为
\u
只是一种约定,如果您在对象文本中有
\u secret:secret
,它也将对外部世界可见。例如,
createSecretHolder()。\u secret=1
将直接为其赋值。这不是我们想要的,对吗?;)这就是我们利用闭包属性的原因。