使用闭包创建私有属性 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;
}
}
}
现在,由于闭包 属性,_secret
在 getSecret
和 setSecret
函数的范围内。这样他们就可以访问它了。
使用_前缀一个属性是一个通用的命名约定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'
我在代码大战中有这个提示
“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;
}
}
}
现在,由于闭包 属性,_secret
在 getSecret
和 setSecret
函数的范围内。这样他们就可以访问它了。
使用_前缀一个属性是一个通用的命名约定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'