很久之前就看了有關JavaScript繼承,都沒怎麼總結,剛好今天有空就來聊聊唄 (^o^)/ 通過不斷試驗 來檢驗自己理解的正確性。 首先JavaScript裡面所有的數據類型都是對象(object),其中的new命令引入Javascript,用來從原型對象生成一個實例對象。 (這裡請註意:在Ja ...
很久之前就看了有關JavaScript繼承,都沒怎麼總結,剛好今天有空就來聊聊唄 (^o^)/
通過不斷試驗 來檢驗自己理解的正確性。
首先JavaScript裡面所有的數據類型都是對象(object),其中的new命令引入Javascript,用來從原型對象生成一個實例對象。
(這裡請註意:在JavaScript中,new命令後面跟的是構造函數)
1、new運算符
用構造函數生成實例對象,有一個缺點,那就是無法共用屬性和方法。
舉個慄子:在Man對象的構造函數中,設置一個實例對象的共有屬性species。
function Man(name){ this.name = name; this.species = "男人"; }
然後,我生成兩個實例對象
var manA = new Man("Yori"); var manB = new Man("bentos");
這兩個對象的species屬性是獨立的,修改其中一個,不會影響到另一個
manA.species = "超人"; alert(manB.species); // 彈窗顯示"男人",不受manA的影響
這說明,每一個實例對象,都有自己的屬性和方法的副本,他們之間不僅無法做到數據共用,而且對資源造成浪費
2、prototype屬性
構造函數有一個prototype屬性,這個屬性包含一個對象(以下簡稱"prototype對象"),
所有實例對象需要共用的屬性和方法,都放在prototype對象裡面,
那些不需要共用的屬性和方法,就放在構造函數裡面。
再舉個慄子:以Man構造函數為例,現在用prototype屬性進行改寫
function Man(name){ this.name = name; };
Man.prototype = { species : "男人" };
var manA = new Man("Yori"); var manB = new Man("bento"); alert(manA.species); // 男人 alert(manB.species); // 男人
因為 species屬性放在prototype對象里,是兩個實例對象共用的。所以只要我修改了prototype對象,就會同時影響到兩個實例對象
Man.prototype.species = "超人"; alert(manA.species); // 超人 alert(manB.species); // 超人
3、構造函數的繼承
現在有一個"人類"對象的構造函數
function Human(){ this.species = "人類"; }
還有一個"男人"對象的構造函數
function Man(name){ this.name = name; }
怎樣才能使"男人"繼承"人類"呢?
(1)構造函數綁定
使用apply方法,將父對象的構造函數綁定在子對象上
就想舉慄子:在子對象構造函數中加一行
function Man(name){ Human.apply(this, arguments); this.name = name; } var manA = new Man("Yori"); alert(manA.species); // 人類
(apply方法重新定義了函數的執行環境,即改變this的指向)
(2)prototype模式
使用prototype屬性,如果"男人"的prototype對象,指向一個Human實例,那麼所有"男人"的實例,就能繼承Human了
慄子如下:我將Man的prototype對象指向一個Human的實例
Man.prototype = new Human(); Man.prototype.constructor = Man; var manA = new Man("Yori"); alert(manA.species); // 人類
註意:任何一個prototype對象都有一個constructor屬性,指向它的構造函數。
因此我才將Man.prototype對象的constructor值改為Man,即 把這個屬性指回原來的構造函數
4、非構造函數繼承
現在有一個"人類"的對象
var Human = { species : "人類" }
還有一個"男人"的對象
var Man = { name : "Yori" }
怎樣才能使"男人"繼承"人類"呢?
(1)object()方法
使用object()函數,把子對象的prototype屬性,指向父對象,從而使得子對象與父對象連在一起
又來慄子:首先我會寫出object()函數
function object(o) { function F() {} F.prototype = o; return new F(); }
使用的時候,先在父對象的基礎上,生成子對象,然後再加上子對象本身的屬性
var Man = object(Human); Man.name = "Yori"; alert(Man.species); // 人類
可以看出,子對象已經繼承了父對象的屬性了。
未完待續》》