2016-01-26 24 views
1

到目前爲止我對JavaScript的瞭解是,傳遞給函數的參數是按值傳遞的,但值本身是引用。讓我們來看看下面的例子:JavaScript JS類用於更改作爲參數從另一個方法發送的屬性值的方法

function change(obj){ 
    obj.x = 10; 
} 

var myObj = {x: 5}; 
console.log(myObj); //Object {x: 5} 

change(myObj); 
console.log(myObj); //Object {x: 10} 

比方說,我們有下面的類:

var myClass = (function(){ 
    function myClass(){ 
     this.x = 5; 
    } 

    myClass.prototype.changeX = function(val){ 
     this.x = val; 
    } 

    return myClass; 
})(); 

var myObj = new myClass(); 
console.log(myObj); //myClass {x: 5} 

myObj.changeX(10); 
console.log(myObj); //myClass {x: 10} 

一切看起來都正常爲止。讓我們擴展我們的類:

var myClass = (function(){ 
    function myClass(){ 
     this.x = 5; 
    } 

    myClass.prototype.changeX = function(prop, val){ 
     prop = val; 
    } 

    myClass.prototype.changer = function(){ 
     this.changeX(this.x, 10); 
    } 

    return myClass; 
})(); 

var myObj = new myClass(); 
console.log(myObj); //myClass {x: 5} 

myObj.changer(); 
console.log(myObj); //myClass {x: 5} 

那麼,爲什麼在最近的一個例子的myObjx屬性沒有改變?如何修改最新示例的changer方法,以便通過發送this.x和要分配給它的值作爲參數來調用changeX方法?

+0

即'prop'變爲在功能的上下文變量的表示。它實際上並沒有設置爲'this.x',你只是通過引用傳遞'this.x'的值。基元通過值傳遞,而對象通過「引用副本」傳遞。這是一個可能的[重複](https://stackoverflow.com/questions/13104494/does-javascript-pass-by-reference)。 –

回答

1

當傳入一個原始類型,如數字/字符串時,該值通過值傳遞,但是當傳入一個對象/數組/函數時,它是通過引用。您傳遞的是對象的屬性,而不是對象本身。

var myClass = (function(){ 
    function myClass(){ 
     this.x = 5; 
    } 

    myClass.prototype.changeX = function(prop, val){ 
     prop.x = val; 
    } 

    myClass.prototype.changer = function(){ 
     this.changeX(this, 10); //Pass the object, not the object property 
    } 

    return myClass; 
})(); 

var myObj = new myClass(); 
console.log(myObj); //myClass {x: 5} 

myObj.changer(); 
console.log(myObj); //myClass {x: 10} 

通過值:

  • 不確定
  • 布爾

通過參考:

  • 對象
  • 陣列
  • 功能
+1

現在有道理。謝謝! –

+0

不客氣!起初有點棘手;) –

相關問題