[概念] javascript構造函數和普通函數的
javascript構造函數和普通函數的區別是什么:
- 調用方式的區別:
- 構造函數需要使用new運算符調用,如果構造函數沒有參數可以省略小括號,比如new Object。
- 普通函數的調用不需要new運算符,而且必須要有小括號。 關於new的作用可以參閱js的new運算符的作用簡單介紹一章節。
- this的指向問題:
- 構造函數的this會被綁定到創建的對象實例上。
- 普通函數的this則屬於此函數的調用者。
- 命名方式:
- 構造函數名稱通常首字母要大些。
- 普通函數名稱首字母要小寫,使用駝峰命名方式。 構造函數
在 JavaScript 中,構造器其實就是一個普通的函數。當使用 new 操作符 來作用這個函數時,它就可以被稱為構造方法(構造函數)。
我的理解:構造函數 就是 類了。 構造函數的 原型 可 擴展 實例化 后 的 方法。 構造函數只有在被new
操作符調用的時候才能稱之為構造函數。其它時候,它就是一個普通函數。這樣構造函數的特殊性還不如說是 new 操作符的 作用 —— 創建對象,並返回對象本身。
通過構造函數 創建的 對象 與 普通的 var object = {} 應該是沒區別的吧。
JavaScript中的普通函數與構造函數
與普通函數相比,構造函數有以下明顯特點
- 用new關鍵字調用
var prince=new Prince("charming",25);
- 函數內部可以使用
this
關鍵字
在構造函數內部,this
指向的是構造出的新對象。用this
定義的變量或函數/方法,就是實例變量或實例函數/方法。需要用實例才能訪問到,不能用類型名訪問。 prince.age;//25 Prince.age;//undefined - 默認不用return返回值 構造函數是不需要用return顯式返回值的,默認會返回
this
,也就是新的實例對象。當然,也可以用return語句,返回值會根據return值的類型而有所不同,細節將在下文介紹。 - 函數命名建議首字母大寫,與普通函數區分開。 不是命名規范中的,但是建議這么寫。
使用new關鍵字實例化的時候發生了什么?
以上文中的Prince()函數舉個栗子:
- 第一步,創建一個空對象。
var prince={}
- 第二步,將構造函數Prince()中的this指向新創建的對象prince。
- 第三步,將prince的_proto_屬性指向Prince函數的prototype,創建對象和原型間關系
- 第四步,執行構造函數Prince()內的代碼。
構造函數有return值怎么辦?
構造函數里沒有顯式調用return時,默認是返回this對象(這個時候,必須要 使用new
關鍵字來調用吧),也就是新創建的實例對象。 當構造函數里調用return時,分兩種情況:
-
return
的是五種簡單數據類型:String,Number,Boolean,Null,Undefined。 這種情況下,忽視return
值,依然返回this
對象。 -
return
的是Object 這種情況下,不再返回this對象,而是返回return語句的返回值。
function Person(name){ this.name=name; return {name:"cherry"} } var person=new Person("sheila"); person.name;//cherry person;//Object {name: "cherry"}