2013-12-08 114 views
-1

爲什麼不能正常工作?關於javascript對象的混淆

function displayValue(a,b){ 
    this.a = a; 
    this.b = b; 
    $('p').text(a + " " + b); 
} 

var display = new displayValue(); 
display('1','2'); 

爲什麼即使沒有「新」關鍵字也能正常工作?

function displayValue(a,b){ 
    this.a = a; 
    this.b = b; 
    $('p').text(a + " " + b); 
} 

var display = displayValue('1','one'); 

使用新的關鍵字,我創建了一個對象?我該如何改變displayValue的屬性?

+3

你正在運行它兩次,看到誰調皮或好,但函數不返回一個函數,並且你沒有在第一次調用中傳遞參數,只是第二次調用,誰沒有真正調用任何東西因爲第一次調用返回對象,所以聖誕老人今晚不會來。 – adeneo

+0

做得好:golfclap: – Pointy

回答

2

爲什麼即使沒有「新」關鍵字,它也能正常工作?

你的第一個例子不是的工作。您在段落元素中會得到"undefined undefined",並且在調用display時控制檯出現錯誤,因爲display不是函數。

如果使用new關鍵字,我是否創建了[sic]對象?

是的。 new運算符創建一個新對象,然後調用構造函數,以便函數內的this是對新對象的引用。

在你的第二個情況下,如果你不使用new,呼叫內displayValuethis實際上是對window對象,它是在瀏覽器中的全局對象的引用。 (如果你使用JavaScript的新的「嚴格」的模式,thisundefined,你會得到一個錯誤做this.a = a;

如何改變displayValue的財產?

恐怕我不明白這個問題。如果你的目標是有一個返回具有ab屬性的對象構造函數,那你就可以用它來更新使用這些屬性段落的文本,它可能是這樣的:

// Defining it 
function DisplayValue(a, b) { 
    this.a = a; 
    this.b = b; 
} 
DisplayValue.prototype.display = function() { 
    $("p").text(this.a + " " + this.b); 
}; 

// Using it 
var d = new DisplayValue(1, 2); 
d.display(); // Changes all paragraphs to "1 2" 
d.a = "A"; 
d.b = "B"; 
d.display(); // Changes all paragraphs to "A B" 
+0

所以沒有'新'的第二個代碼實際上不是一個好的做法?因爲我看到很多程序員都這麼做。 – user3057928

+0

@ user3057928:完全取決於你想要做什麼。如果它是一個構造函數,則只能在函數內使用'this',否則將使用'this'調用的函數具有特定的含義。 (例如,使用'addEventListener'或像jQuery這樣的庫附加到DOM元素上的事件處理程序,通過引用元素'this'來調用。 –

0

JavaScript中的函數有兩個不同的角色:

1-它們作爲您在第二個塊中使用的函數。 2-可以將它們用作類來創建對象,就像您在第一個塊中使用它們一樣。

同樣的功能將作爲不同的手段,例如:

var display = new displayValue(); 

意味着你要根據你的等級(功能)來創建一個對象,因爲你已經使用new關鍵字,也是display由於var display = new displayValue();不是一個函數,它是一個JavaScript對象,你可以得到你的道具如下:display.adisplay.b。但是,當用它像一個方法:

displayValue('1','one'); 

這種方式,它僅僅是被調用的函數,在這裏最重要的一點是this在此功能將指向函數的容器對象,大多是你的頂級課程或window對象。 in your function: function displayValue(a,b){this.a = a; this.b = b; $('p')。text(a +「」+ b); } 當你做this.a = a;,主要是它意味着你要使用它作爲一個類或作爲一個頂級類的方法,例如:

function Display(){ 
    this.displayValue=function displayValue(a,b){ 
     this.a = a; 
     this.b = b; 
     $('p').text(a + " " + b); 
    } 
} 

function Display(){ 
    //the constructor 
} 
Display.prototype.displayValue = function displayValue(a,b){ 
    this.a = a; 
    this.b = b; 
    $('p').text(a + " " + b); 
}; 
在此

例如,如果您嘗試var obj = new Display();,則this中的關鍵字displayValue函數將指向Display的當前實例,即obj