JS構造函數中有return


 1 function foo(name) {  2     this.name = name;  3     return name  4 }  5 console.log(new foo('光何'))  6 
 7 function bar(name) {  8     this.name = name;  9     return ['光','何'] 10 } 11 console.log(new bar('光何'))

結果為:

1 'ooo {name: "光何"}'
2 'Array(4) ["光", "何"]'

創建JS對象兩種方式

在JavaScript中,創建對象的方式包括兩種:對象字面量和使用new表達式。對象字面量是一種靈活方便的書寫方式,例如:

1 var o = { 2     name : '光何'
3 }

new表達式是配合構造函數使用的:

1 function O(name){ 2     this.name = name; 3 } 4 var o = new O('光何');

那么,在使用new操作符來調用一個構造函數的時候,發生了什么呢?其實很簡單,就發生了四件事:

1 var obj  ={}; 2 obj.__proto__ = CO.prototype; 3 CO.call(obj); 4 return obj;

  第一行,創建一個空對象obj。

  第二行,將這個空對象的proto成員指向了構造函數對象的prototype成員對象,這是最關鍵的一步。

  第三行,將構造函數的作用域賦給新對象,因此CA函數中的this指向新對象obj,然后再調用CO函數。於是我們就給obj對象賦值了一個成員變量name,這個成員變量的值是"光何"。

  第四行,返回新對象obj。這一步就是我們需要注意的地方,構造器中如果包含返回值。

構造函數

  如果沒有按照正確的方法書寫構造函數的話,就像本文上文中出現的情況。就會造成一些難以估計的后果。

  一個函數,要做為一個真正意義上的構造函數,要滿足以下條件。

  1、 在函數內部對新對象(this)的屬性進行設置,通常是添加屬性和方法。

  2、 構造函數可以包含返回語句(不推薦),但返回值必須是this,或者其它非對象類型的值。

  如上文中 我們的構造函數中返回了參數name,如果參數是普通值(非引用類型),則不會發生什么影響,但是如果值是引用類型(如對象,數組等),則我們new 出來的對象就會被返回的引用類型值給替換了。

  可以看出:在JavaScript構造函數中:如果return值類型,那么對構造函數沒有影響,實例化對象返回空對象;如果return引用類型(數組,函數,對象),那么實例化對象就會返回該引用類型;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM