我正在尝试将对象设为私有,但不确定如何执行此操作。正如您所看到的,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 }
答案 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,
};
}
在这两种情况下,您将在每次调用时创建一个新对象。