JavaScript核心篇-使用建構式自定義原型

Randy Chen
Nov 16, 2020

--

像創世神一樣,創建自己要個建構式藍圖
function Dog(name, color, size){
this.name = name;
this.color=color;
this.size=size;
} // 建構函式Dog
var Bibi = new Dog("比比", "白", "大");console.dir(Dog);

上面這個範例中,

Dog函式是建構函式,它本身是ㄧ個藍圖,藍圖本身並不能成為一個實體,所以,我們透過運算子new來創見出以Dog為藍圖的實體。

當我們使用new運算子,會有以下幾點特性

  1. 它會產生一個新的空白物件
  2. 將連結原本的建構物件到其它的物件(即將建構函式Dog連結到實體Bibi)
  3. 將新產生出的this綁定到建構函式之中,即,我們創出的新物件的this會綁定在建構函式之中

依照上面這個範例,Bibi是透過Dog這個原型所創建出來的實體,故Dog事實體Bibi的原型。

接著,我們利用console.dir,可以在Dog的屬性中看到prototype這個屬性,這是函式物件所特有的屬性,我們可以利用它來為原型新增屬性或方法。

Dog.prototype.bark = function(){
console.log(this.name + '吼叫')
}
Bibi.bark();

由上面的方式,我們就利用protype來為原型Dog新增方法bark,也因為實體是繼承自原型Dog,所以,它也會同時繼承bark這個方法,自然它就可以調用bark這個方法囉~

Appendix: __proto__ 和 prototype的用法差異

__proto__ 是物件上連結原型的一個屬性,但是它不是一個正式的屬性

prototype 是函式物件中的一個屬性

若今天我們希望為一個原型新增一個屬性或方法,最好是利用建構函式的protype的方式來新增。

不要用單一實體的__proto__屬性來為原型新增屬性或方法,因為,這會造成管理上的麻煩,萬一該原型創建出十個實體,每個實體都用__proto__來為原型新增屬性,這樣不是超麻煩的嗎~~

倒不如直接用建構函式的protype來為原型新增屬性,這樣子比較統一,程式碼也比較好管理。

--

--

Randy Chen

Keep fertilizing it, Keep watering it, Keep marching on