javascript对象私有属性表现得像公共一样

时间:2014-08-13 21:36:55

标签: javascript object properties private

当我试图在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()调用my.getName()方法;

对我而言,在该对象中,newBuddy.name应始终返回undefined。

直到那一刻,我才自信地使用物体,我真的无法弄清楚我在想什么。

我使用Firefox 31.0在我的firebug 2.0.2控制台中运行该代码,我怀疑它有什么不同。

2 个答案:

答案 0 :(得分: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;
  }
}

答案 1 :(得分:0)

问题在于如何在getter和setter方法中分配/访问变量。

this.setName = function (name) {
     this.name = name;
}

设置this.name时,您将在person实例上创建该属性。如果您希望设置局部变量name的值,则只需省略this

例如:

this.setName = function (name) {
     name = name;
}

然而,这仍然无法正常运行,因为参数name与'private'属性具有相同的名称,这意味着标识符name将始终解析为参数{{1而不是'私人'属性。这可以通过重命名参数或私有变量来解决。我只想在私有变量前加name

_