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,你已经为nameage声明了本地(私有)变量:

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 对象私有属性的行为就像是公共的的主要内容,如果未能解决你的问题,请参考以下文章

javascript 仿面向对象编程实例代码(私有,公共变量。。。)

JavaScript编写类

Javascript:带有公共访问器的私有对象

Javascript进阶---编写类

Javascript 公共/私有变量

面向对象