2016-04-28 31 views
2

我試圖讓一個對象是私人的,但不知道如何做到這一點。正如你所看到的名稱變量是私有的,我不能編輯它,但是當涉及到我返回的對象時,我可以編輯它。不過,我不希望這是可能的。 在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

如果您不想更改'person.getOther()'的返回值來更改'otherInfo'的值,那麼您需要返回它的一個副本。 – forgivenson

+0

我該怎麼做? –

+0

http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object – Jonathan

回答

0

這是發生,因爲在JS對象通過鏈接 - 沒有從源對象coped。

剛剛嘗試複製對象:

如字符串
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 } 
+0

這並不是真正的複製對象。相反,它使用'this.otherInfo'作爲新對象的原型。 – forgivenson

+0

好的。它是不同的快速答案。我將其更改爲Object.assign –

+0

您的代碼仍然無法使用。測試一下。 – forgivenson

1

原始值按值傳遞。這意味着當您將一個字符串分配給您的變量時,您將該字符串的實際值設置爲該變量。

對象是通過引用傳遞。這意味着當您將一個對象分配給您的變量時,您只需將對象的引用,而不是它的實際值。如果您有一個對象並將其分配給6個不同的變量,則每個變量將具有對同一個基礎對象的引用

在您的示例中,您的getOther方法正在將參考返回到otherInfo對象。所以,當你將age屬性設置爲「wtf」時,你將它設置在你的變量引用的對象上。

0

您還聲明var name兩次。

當您在用戶功能的範圍內聲明var person = new User(); a var name時。

當你var name = person.getName();你聲明一個變量具有相同的名稱超出了用戶功能的範圍。

因此,當您name = 'Jenny';解釋器將此字符串name變量關聯到用戶範圍之外。

一般來說,將通用名稱(名稱,標題,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 } 
0

您不必在Javascript對象範圍「私人」的事情。從外部隱藏事物的唯一方法是使用函數範圍,就像您使用name(函數User中的局部變量)所做的那樣。

要每次返回一個內容相同的對象,可以在該函數內部創建該對象。與此類似,比如:

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

或者只是:

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

在這兩種情況下,您將創建與每個調用一個新的對象。

相關問題