Javascript 我可以使用显示模块模式对闭包中的变量使用getter/setter吗?
我认为我可以使用setter来更改闭包变量,但是当我直接访问变量时,它是不变的。只有当我使用getter访问它时,我才能得到预期的重新分配变量。是否在不同的范围内创建了第二个变量?这里发生了什么Javascript 我可以使用显示模块模式对闭包中的变量使用getter/setter吗?,javascript,revealing-module-pattern,Javascript,Revealing Module Pattern,我认为我可以使用setter来更改闭包变量,但是当我直接访问变量时,它是不变的。只有当我使用getter访问它时,我才能得到预期的重新分配变量。是否在不同的范围内创建了第二个变量?这里发生了什么 var obj = (function () { var name = "one"; var setName = function(strName) { name = strName; }; var getName = function() { return name;
var obj = (function () {
var name = "one";
var setName = function(strName) {
name = strName;
};
var getName = function() {
return name;
};
return {
name: name,
setName: setName,
getName: getName
};
}());
obj.setName("two");
alert("obj.name is: " + obj.name); // Prints "one", but why not "two"?
alert("obj.getName() is: " + obj.getName()); // Prints "two" as I'd expect.
我已将上面的示例添加到中,在本例中,您将在对象中存储对闭包属性的引用
重写闭包变量的值时,对象属性仍将引用旧对象。在这种情况下,您将在对象中存储对闭包属性的引用
return {
name: name,
setName: setName,
getName: getName
};
重写闭包变量的值时,对象属性仍将引用旧对象
return {
name: name,
setName: setName,
getName: getName
};
上面的对象是在更新变量之前创建的,因此它将具有旧值
上述对象是在您更新变量之前创建的,因此它将具有旧值,您可以使用该值来完成您尝试执行的操作:
var obj=函数(){
var name=“一”;
var setName=函数(strName){
名称=strName;
};
var getName=function(){
返回名称;
};
var结果={
setName:setName,
getName:getName
};
defineProperty(结果,'name',{get:getName});
返回结果;
}();
对象集合名(“两个”);
警报(“obj.name为:“+obj.name”);//二
警报(“obj.getName()为:”+obj.getName());//二
以下是更新后的JSFIDLE:您可以使用它来完成您想要做的事情:
var obj=函数(){
var name=“一”;
var setName=函数(strName){
名称=strName;
};
var getName=function(){
返回名称;
};
var结果={
setName:setName,
getName:getName
};
defineProperty(结果,'name',{get:getName});
返回结果;
}();
对象集合名(“两个”);
警报(“obj.name为:“+obj.name”);//二
警报(“obj.getName()为:”+obj.getName());//二
下面是更新后的JSFIDLE:您可能要寻找的逻辑是:
var obj = function () {
var name = "one";
var setName = function(strName) {
this.name = strName;
};
var getName = function() {
return this.name;
};
return {
name: name,
setName: setName,
getName: getName
};
}();
obj.setName("two");
alert("obj.name is: " + obj.name); // one
alert("obj.getName() is: " + obj.getName()); // two
this
(在this.name
中)所代表的内容可能具有误导性
调用方法obj.setName()
时,this.name
表示返回对象中的name属性,而不是顶部的第一个name
变量
此
关键字信息:您可能要查找的逻辑是:
var obj = function () {
var name = "one";
var setName = function(strName) {
this.name = strName;
};
var getName = function() {
return this.name;
};
return {
name: name,
setName: setName,
getName: getName
};
}();
obj.setName("two");
alert("obj.name is: " + obj.name); // one
alert("obj.getName() is: " + obj.getName()); // two
this
(在this.name
中)所代表的内容可能具有误导性
调用方法obj.setName()
时,this.name
表示返回对象中的name属性,而不是顶部的第一个name
变量
此
关键字信息:在您的代码中:
var obj = function () {
var name = "one";
此名称是局部变量对象的属性。这是setName和getName引用的。它在范围链上解决
return {
name: name,
此名称是返回对象的一个属性,即它是一个不同的“名称”,并使用对象属性标识解析(即,它与解析范围链上的标识符完全不同)进行解析。上面的行指定了局部变量名的当前值,这里没有闭包
setName和getName正在设置闭合变量,obj.name不会被这些函数修改。在代码中:
var obj = function () {
var name = "one";
此名称是局部变量对象的属性。这是setName和getName引用的。它在范围链上解决
return {
name: name,
此名称是返回对象的一个属性,即它是一个不同的“名称”,并使用对象属性标识解析(即,它与解析范围链上的标识符完全不同)进行解析。上面的行指定了局部变量名的当前值,这里没有闭包
setName和getName正在设置闭合变量,obj.name不被这些函数修改。请在IIFE中包含括号,以便在我到达最后一行代码之前,它显然是IIFE!!(即,
var obj=(function(){…}());
Fixed just for your:)请在IIFE中包含括号,以便在我到达最后一行代码之前,它显然是IIFE!!(例如,var obj=(function(){…}());
Fixed just for your:)因此,如果我理解正确,我将返回一个带有本地名称变量副本的对象,而不是对它的引用。因此,如果我理解正确,我将返回一个带有本地名称变量副本的对象,而不是对它的引用。