一、關於物件
在了解建構函式之前,我們需要先了解下物件,我們都聽說物件導向程式設計,那麼這當中的物件是什麼,簡單來說,物件是個功能模組,這個功能可以接收資訊,處理資訊和傳送資訊。從我們**的角度看,物件是乙個封裝了屬性和方法的容器,屬性是物件的狀態,方法則是物件的行為(完成某種任務)。我們可以用這個物件對現實生活中的實物進行抽象描述,比如,我們把飛機看做物件,那麼可以使用「屬性」記錄具體是哪種機型,同時使用「方法」表示飛機的表現行為,是起飛、飛行中還是降落等。緊接著,我們把飛行員看做物件。使用「屬性」記錄飛行員的資訊,使用「方法」表示飛行員對飛機的操作,那麼飛行員對飛機的操作、飛機的表現行為之間構成的關係,可以抽象為兩個物件之間的關係,這種用**物件模擬現實情況的操作,就是物件導向程式設計。
二、什麼是建構函式
使用物件導向程式設計,第一步就是要創造物件,在js中,建構函式是建立物件的方式之一,建構函式(簡稱constructor)其實就是乙個普通函式的公升級版函式,區別於普通函式就在於用法不同,建構函式是可以提供模板,用來生成多個物件的函式,你也可以理解為,乙個普通函式可以被多次使用生成不同的物件,那麼這個普通函式就是建構函式,在寫法上,為了容易辨認建構函式,建構函式名字的第乙個字母通常大寫,建構函式中必定存在this,普通函式也可以存在this,this指向window全域性。乙個簡單的建構函式如下:
var i = 0function
plane (type)
i ++
console.log(i)
console.log(this)
}
plane() // window ;type與state是window物件的乙個屬性方法三、為什麼要使用建構函式建構函式是可以提供模板,用來生成多個物件的函式,對乙個新建立的物件進行初始化,可以減少我們許多重複的**,比如要建立許多種飛機的物件,我們可以通過建構函式先初始所有飛機共用的屬性和行為表現,之後傳值呼叫建構函式即可,無需每個飛機種類都去宣告乙個物件。
四、如何使用建構函式
直接呼叫建構函式,則相當於是呼叫乙個普通函式,要使建構函式得到復用,則需要結合new,通過new呼叫建構函式來例項化建立新的物件,比如建立波音飛機和梟龍戰機的物件,呼叫上述建構函式,為:
var boyin = new plane('波音'); // 建構函式執行一遍,輸出 plane ,1
boyin.state(); // 波音起飛
var xiaolong = new plane('梟龍') // 建構函式再執行一遍,輸出 plane ,2
xiaolong.state(); // 梟龍起飛
五、為什麼new可以實現呼叫建構函式例項化建立新的物件
通過new呼叫建構函式來例項化建立新的物件,這個過程中,發生了一下五個步驟:
1、建立乙個名為變數的空變數
2、將新物件的_proto_屬性指向建構函式的prototype原型
3、將建構函式中的this指向新物件
4、執行一遍建構函式中的**
如果使用**來模擬這個過程,如下:
new plane("波音") =; // 宣告空物件其中,關於obj._proto_ = plane.prototype,是設定物件的_proto_屬性來鏈結到函式的prototype屬性,當我們訪問新構建的物件的屬性和方法時,會先在建構函式上找,找不到就沿著原型鏈向上追溯。obj.__proto__ =plane.prototype; // 設定物件的_proto_屬性來鏈結到函式的prototype屬性
var result = plane.call(obj,"波音"); // 通過call改變this指向,同時執行plane方法和傳值
return
typeof result === 'object'?result : obj; // 將結果返回
}
在這裡可以說下關於_proto_和prototype。
_proto_是乙個物件擁有的內建屬性(請注意:每個物件都有乙個_proto_屬性,_proto_是物件的內建屬性),是js內部繼承和使用建構函式以及尋找函式原型鏈上的屬性和方法的屬性。
prototype是函式的乙個屬性((請注意:每個函式都有乙個prototype屬性,prototype是函式的內建屬性),這個屬性是乙個指標,指向乙個物件。這個物件你可以理解為包含建構函式以及其原型上的屬性和方法,同時包含其他內容的大物件。有趣的是,prototype是個物件,也具有_proto_
回歸obj._proto_ = plane.prototype,從上面列印出來的a物件的_proto_以及b函式的prototype,可以看出共同擁有constructor屬性,每乙個物件例項都可以通過 constrcutor 物件訪問它的建構函式,因此obj._proto_ = plane.prototype就將obj物件與plane函式關聯起來了。擁有了plane函式的屬性和方法。
我們在建構函式plane的原型上新增屬性和方法,在new例項化後通過物件訪問,結果物件是能訪問到的:
六、多用途建構函式,關於建構函式中的return
乙個建構函式內部使用了return,就可以成為乙個多用途建構函式,具體可看下例子:
function建構函式中如果加入了return的話,需要注意分兩種情況c2(a, b)
return
this.p;//
此返回語句在c2作為建構函式時沒有意義
}var c2 = new c2(2,3);
c2.alertp();
//結果為5
alert(c2(2, 3)); //
結果為5
1. return的是五種簡單資料型別:string,number,boolean,null,undefined,則new例項化建構函式時,return回來的是空物件
2、如果return的是物件,則new例項化建構函式時,return回來的是物件
七、es6中建構函式的寫法
我們用es6寫法來改上面的es5寫法建構函式:
let i = 0class plane上面**定義了乙個「類」,可以看到裡面有乙個state ()
}
constructor
方法,這就是構造方法,裡面存放屬性值,而this
關鍵字則代表例項物件。至於函式方法,需要注意,定義「類」的方法的時候,前面不需要加上function
這個關鍵字,直接把函式定義放進去了就可以了。另外,方法之間不需要逗號分隔,加了會報錯。還有,不能在類裡面新增多餘**,比如把「i++」和「console」等放到state方法之外。這也嚴格限制了在建構函式中新增多餘**。
class做了什麼呢,就是將所有方法都寫在建構函式的prototype屬性上,上面的寫法實際等於,所以在類的例項上面呼叫方法,其實就是呼叫原型上的方法。
plane.prototype =,使用的時候,也是直接對類使用state (type)
}
new
命令,跟建構函式的用法完全一致,不同的是呼叫方法需要傳參了。
var boyin = new plane('波音');關於es6的class類,還有很多東西可以了解,且看下會分解~~~boyin.state(); //
波音起飛
一步步學ROS
最近因為看svo的 裡面用到catkin決定要好好看ros,年前學會基本操作。啟動節點 rosrun package name executable name 檢視節點 rosnode list 注 rosout 節點是乙個特殊的節點,通過 roscore 自動啟動 檢視特定節點的資訊 rosnod...
windows Thrift c 一步步搭建
1.thrift 原始碼路徑 2.libevent原始碼路徑 3.boost路徑 安裝 conan install boost 1.68.0 conan stable 4.openssl路徑 安裝 conan install openssl 1.1.1a conan stable conan安裝bo...
一步步啟動linux
可以一步一步啟動linux.在ubantu剛一啟動時,按c健即進入grub 提示符狀態,在此狀態下輸入 我用的是ubuntu 13 grub linux vmlinuz grub ls boot grub initrd boot initrd.img 3.11.0 15 generic grub b...