javascript 对象私有属性的行为就像是公共的
Posted
技术标签:
【中文标题】javascript 对象私有属性的行为就像是公共的【英文标题】:javascript object private property behaves as if public 【发布时间】:2014-10-07 10:17:12 【问题描述】:当我试图在 js 对象中向某人展示公共属性和私有属性时,我突然感到非常困惑。
让我们来看看下面的对象:
function person()
var name = 'joe';
var age = '32';
this.setName = function (name)
this.name = name;
this.setAge = function (age)
this.age = age;
this.getName = function ()
return this.name;
this.getAge = function ()
return this.age;
var newBuddy = new person();
我希望 newBuddy.name 和 newBuddy.age 在这个阶段是未定义的。他们是。到目前为止一切顺利!
但是,请看以下内容:
newBuddy.setName('matt'); //I use my setName() method to change the name.
newBuddy.name; // returns "matt" -> that' what I cannot understand.
// I was expecting not to be able to access this property. Ever. See below.
我的思考过程是: 如果我声明 this.name = 'joe' 而不是 var name = 'joe',我会理解 newBuddy.name 先返回 'joe',然后返回 'matt'。公共财产本来是可以访问的。
但是因为我用“var name”声明了我的属性,我不应该无法访问这个属性吗?
我的理解是,获取名称的唯一方法是使用 newBuddy.getName(); 调用我的 this.getName() 方法
对我来说,在那个对象中,newBuddy.name 应该总是返回 undefined。
在那一刻之前,我对使用对象充满信心,但我真的不知道自己错过了什么。
我使用 Firefox 31.0 在我的 firebug 2.0.2 控制台中运行了该代码,我怀疑它有什么不同。
【问题讨论】:
我在这里得到了同样的结果:jsfiddle.net/6xxtwrp8我也很好奇这个... 哦!我知道为什么......你在变量名前面使用了this
。不要把this
放在那里。
【参考方案1】:
问题在于您如何在 getter 和 setter 方法中分配/访问变量。
this.setName = function (name)
this.name = name;
当您设置this.name
时,您将在person
实例上创建属性。如果你想设置局部变量name
的值,你可以省略this
。
例如:
this.setName = function (name)
name = name;
但是,这仍然无法正常工作,因为参数 name
与“私有”属性具有相同的名称,这意味着标识符 name
将始终解析为参数 name
而不是 '私人财产。这可以通过重命名参数或私有变量来解决。我只需在私有变量前面加上 _
:
function person()
var _name = "Joe";
this.setName = function (name)
_name = name;
this.getName = function ()
return _name;
【讨论】:
谢谢。现在说得通了。【参考方案2】:你不应该使用this
,你已经为name
和age
声明了本地(私有)变量:
function Person()
var _name = 'Joe';
var _age = 32;
this.setName = function (name)
_name = name;
this.setAge = function (age)
_age = age;
this.getName = function ()
return _name;
this.getAge = function ()
return _age;
【讨论】:
违反 cmets 规则。只是想说谢谢大家。这有很大帮助。变得非常沮丧!以上是关于javascript 对象私有属性的行为就像是公共的的主要内容,如果未能解决你的问题,请参考以下文章