当我的变量出现时,为什么我的对象不是私有的?

时间:2016-04-28 10:54:05

标签: javascript private-members

我正在尝试将对象设为私有,但不确定如何执行此操作。正如您所看到的,name变量是私有的,我无法编辑它,但是当涉及到我返回的对象时,我可以进行编辑。不过,我不希望这是可能的。 我对javascript中的面向对象和私有方法都很陌生,所以有人可以告诉我这里有什么是对的。 :)我该怎么解决这个问题? 谢谢!

var User = function() {

  var name = 'bob';
  this.getName = function() {
    return name;
  }

  var otherInfo = {
    age: 20,
    human: true,
  }
  this.getOther = function() {
    return otherInfo;
  }

}

var person = new User();

var name = person.getName();
name = 'jenny';
console.log(person.getName()); // bob

var other = person.getOther();
other.age = 'wtf?';
console.log(person.getOther()); // { age: 'wtf?', human: true }

4 个答案:

答案 0 :(得分:1)

字符串等原始值按值传递。这意味着当您为变量分配String时,您将String的实际值设置为变量。

对象通过引用传递。这意味着当您将一个Object分配给您的变量时,您只需要对该对象进行引用,而不是它的实际值。如果您有一个Object并将其分配给6个不同的变量,则每个变量都会有一个引用到同一个底层对象。

在您的示例中,您的getOther方法正在向<{1}}对象返回引用。因此,当您将otherInfo属性设置为“wtf”时,您将在您的变量引用的Object上进行设置。

答案 1 :(得分:0)

它发生了,因为在JS对象中通过链接传递 - 没有来自源对象的处理。

试试复制对象:

var User = function() {

  var name = 'bob';
  this.getName = function() {
    return name;
  }

  var otherInfo = {
    age: 20,
    human: true,
  }
  this.getOther = function() {
    return Object.assign({}, otherInfo);
  }

}

var person = new User();

var name = person.getName();
name = 'jenny';
console.log(person.getName()); // bob

var other = person.getOther();
other.age = 'wtf?';
console.log(person.getOther()); // { age: 20, human: true }

答案 2 :(得分:0)

您还要声明var name两次。

var person = new User();在用户功能范围内宣布var name时。

当你var name = person.getName();声明一个在User函数范围之外具有相同名称的变量时。

因此,当您name = 'Jenny';解释器将此字符串与用户范围之外的name变量相关联时。

通常,使用具有通用名称(name,title,id,...)的变量作为全局变量是一个坏主意。我会使用this.引用对象属性并定义setters以及getters。您也可以忽略setters并使用person.引用用户属性,如下所示:

function User() {
  this.name = 'bob';
  this.getName = function() {
    return this.name;
  }

  this.otherInfo = {
    age: 20,
    human: true,
  }
  this.getOther = function() {
    return this.otherInfo;
  }

}

var person = new User();

console.log(person.getName()); // bob
person.name = 'jenny';
console.log(person.getName()); // jenny

console.log(person.getOther(); // { age: 20, human: true }
person.otherInfo.age = 'wtf?';
console.log(person.getOther()); // { age: 'wtf?', human: true }

答案 3 :(得分:0)

您在Javascript中的对象范围内没有“私有”内容。从外部隐藏事物的唯一方法是使用函数范围,就像使用name(函数User中的局部变量)一样。

要每次返回具有相同内容的对象,您可以在函数内部创建对象。像这样,例如:

this.getOther = function() {
    var otherInfo = {
        age: 20,
        human: true,
    }
    return otherInfo;
}

或者只是:

this.getOther = function() {
    return {
        age: 20,
        human: true,
    };
}

在这两种情况下,您将在每次调用时创建一个新对象。