javascript建構函式
阿新 • • 發佈:2019-01-09
“物件”是一個實物的抽象,通常需要一個模板,表示某一類實物的共同特徵,然後“物件”根據這個模板生成。典型的面嚮物件語言(如C++和JAVA)有一個“類”的概念,這個“類”就是物件的模板。但是javascript不是基於類的,而是基於“建構函式Constructor”和“原型鏈Prototype"
建構函式的寫法跟普通函式的寫法一樣,但是它的函式名首字母要大寫。
建構函式的特點有兩個:1、函式體內部使用了this關鍵字,代表所要生成的物件例項;2、生成物件的時候必需用new
eg:
var Vehicle = function(){ this.price = 2000; } var v = new Vehicle();
括號裡還可以帶引數。由於new命令本身就可以執行建構函式,所以後面的建構函式可以帶括號也可以不帶。
如果忘了使用new命令,那麼建構函式就變成了普通函式,這時的this就代表了全域性物件。為了保證建構函式必須與new命令一起使用,可以在建構函式內部使用嚴格模式(在嚴格模式中函式內部this不能指向全域性物件)
eg:
var Vehicle = function(){
'use strict';
this.price = 2000;
}
Vehicle();
結果:Uncaught TypeError: Cannot set property 'price' of undefined
at Vehicle
解決方法二是在建構函式內部判斷是否使用new命令,如果沒有使用,則直接返回一個例項物件。
eg:
function Vehicle(){
if(!(this instanceof Vehicle)){
return new Vehicle();
}
this.price = 2000;
}
Vehicle().price;
(new Vehicle()).price;
————————————————————————————————————————————————————
函式內部可以使用new.target屬性。如果當前函式是new命令呼叫,new.target指向當前函式,否則為undefined
eg:
function f(){
console.log(new.target === f);
}
f();//false
new f();//true