首頁 >web前端 >js教程 >Javascript 建構函數詳解_基礎知識

Javascript 建構函數詳解_基礎知識

WBOY
WBOY原創
2016-05-16 16:33:071434瀏覽

一、什麼是建構子

在一些物件導向的語言,如Java、C 、PHP中,建構子是很常見的。在Javascript中建構函數首先是一個普通的函數,它可以使用new 操作符來調用,並產生一個特殊類型的物件。

複製程式碼 程式碼如下:

// "Benjamin" is a constructor
var benjamin = new Benjamin("zuojj", "male");

在上面這個實例中benjamin是一個Benjamin對象,那麼它是如何來實例化的呢?

複製程式碼 程式碼如下:

function Benjamin(username, sex) {
    this.username = username;
    this.sex = sex;
}
var benjamin = new Benjamin("zuojj", "male");
//Outputs: Benjamin{sex: "male",username: "zuojj"}
console.log(benjamin);

正如我們所看到的,「Benjamin」建構子只是接收傳遞過來的參數,並且把它們賦值給this物件。這是因為當建構子被new操作符呼叫時,建構子的this物件賦值為new操作傳回的物件。
這意味著上面的程式碼等同於:

複製程式碼 程式碼如下:

benjamin = {
 "username": "zuojj",
 "sex": "male"
}

二、為什麼要用建構子

為什麼要使用建構函數,有以下幾個方面的原因:
1.使用建構函數,意味著所有的這些對象,都可以使用相同的基本結構來建立
2.使用建構函數,表示「benjamin」物件被明確的標記為「Benjamin」函數的實例

複製程式碼 程式碼如下:

function Benjamin(username, sex) {
    this.username = username;
    this.sex = sex;
}
var benjamin = new Benjamin("zuojj", "male");
var ben = {
 "username": "zuojj",
 "sex": "male"
}
//Outputs: true
console.log(benjamin instanceof Benjamin);
//Outputs: false
console.log(ben instanceof Benjamin);

3.使用建構函數,意味著我們可以在原型上定義公共方法,供多個實例共享

複製程式碼 程式碼如下:

function Benjamin(username, sex) {
    this.username = username;
    this.sex = sex;
}
Benjamin.prototype.getName = function() {
 return this.username;
}
var benjamin = new Benjamin("zuojj", "male");
var ben = new Benjamin("lemon", "female");
//Outputs: zuojj
console.log(benjamin.getName());
//Outputs: lemon
console.log(ben.getName());

三、注意事項

1.new 關鍵字
在實例化建構函數的時候一定不要忘了使用new關鍵字,是否使用new關鍵字,對this物件的影響很大,不用new關鍵字的情況下,this物件會指向全域物件(window in browser and global in node)。因此定義建構函數時,建議函數名稱首字母大寫。
2.如果被呼叫的函數沒有明確的 return 表達式,則隱式的會返回 this 對象 – 也就是新創建的對象,否則將會影響返回的結果,但僅限於返回的是一個對象

複製程式碼 程式碼如下:

function Bar() {
    return 2;
}
var bar = new Bar();
//傳回新建立的物件
//Outputs: Bar {}
console.log(bar);
function Test() {
    this.value = 2;
    return {
        foo: 1
    };
}
var test = new Test();
//傳回的物件
//Outputs: Object {foo: 1}
console.log(test);

我們要注意的是:
a) new Bar() 回傳的是新建立的對象,而不是數字的字面值 2。 因此 new Bar().constructor === Bar,但如果傳回的是數字對象,結果就不同了;
b) 這裡得到的 new Test()是函數傳回的對象,而不是透過new關鍵字新建立的對象,如下所示:

複製程式碼 程式碼如下:

function Bar() {
    return 2;
}
var bar = new Bar();
function BarN() {
 return new Number(2);
}
var barn = new BarN();
//Outputs: true
console.log(bar.constructor === Bar);
//Outputs: Number {}
console.log(barn);
//Ouputs: false
console.log(barn.constructor === BarN);
//Outputs: true
console.log(barn.constructor === Number);
/* -------------------------------------- */
function Test() {
    this.value = 2;
    return {
        foo: 1
    };
}
var test = new Test();
//Outputs: undefined
console.log(test.value);
//Ouputs: 1
console.log(test.foo);

以上就是對構造函數的總結,希望對初學者有所幫助,文中不妥之處,望批評、斧正。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn