前言:大多oo語言都支援兩種繼承方式: 接口繼承和實作繼承. 而ecmascript中無法實作接口繼承,ecmascript隻支援實作繼承. 而且其實作繼承主要是依靠 原型鍊 來實作。
每個構造函數都有一個原型對象
原型對象包含一個指向構造函數的指針(這句話特别重要)
執行個體都包含一個指向原型對象的内部指針
每個構造函數都有一個原型對象,原型對象包含一個指向構造函數的指針(prototype),而執行個體則包含一個指向原型對象的内部指針(proto)。
基本思想:利用原型,讓一個引用類型繼承另外一個引用類型的屬性和方法。 可以簡單的了解為,讓目前類的原型對象 = new other(); 這樣原型對象包含一個指向構造函數的指針,就是指向父類new的構造指針。 所有父類的this相當于就是子類的this啦,父類的屬性方法會被覆寫。
例子:
基本思想:在子類型構造函數的内部調用超類構造函數. 通過使用call()和apply()方法可以在新建立的對象上執行構造函數 因為call和apply方法的目的就是複用目前存在類中的方法或者屬性,構造也是不在話下 是以父類中的this被改變為目前類的this,然後執行環境就是目前的執行環境。 總之call和apply既可以用到構造函數裡面也可以用到普通函數裡面 但有一點是他們都不能繼承原型鍊(不能繼承原型鍊) 估計和new不一樣吧,使用new的時候會把目前構造函數的原型對象指向this指針 但是call的時候沒有原型對象是以原型的方法不能夠去調用
但是不能調用父類的原型方法,比如:
估計是一個函數就一個原型對象,在構造中在此使用原型對象不太合理。
這個我還得看看書,慢慢的了解。
第一使用原型鍊的時候不可以向父類傳遞參數。 第二使用借用構造的時候不能繼承原型鍊。 所有結合一起的意思就是既可以通路原型鍊,又可以向父類傳遞參數。
優勢:可以傳遞參數,可以通路原型鍊
基本想法:借助原型可以基于(已有)的對象建立新對象,同時還不必須是以建立自定義的類型。 我自己的了解,将一個已經建立好的對象的屬性和方法放置在心建立的對象的原型指針上。 建立一個對象:console.dir()可以顯示一個對象所有的屬性和方法。
原型式繼承:将已經建立好的對象的所有屬性全部放置在新的對象的原型指針上
測試:
總結:感覺這個很第一個利用原型鍊一樣的,隻是一個是建立好的對象,一個是沒有建立的對象,實質是一樣的。最好自己通過控制台打出來自己看一下,友善了解。
再次了解将person改變一下:
測試2:
ecmascript5通過新增object.create()方法規範化了原型式繼承。 這個方法接收兩個參數: 一個用作新對象原型的對象 一個作為新對象定義額外屬性的對象。
例子:自己列印出來看看!
基本思想:建立一個僅用于封裝繼承過程的函數,該函數在内部以某種方式來增強對象,最後再像真正是它做了所有工作一樣傳回對象。
先看個例子:
ojbject 函數将person的屬性等全部放置在原型鍊上,有點像原型鍊式的繼承。
原型鍊的例子:
将對象以前的方法繼承下來,放置在原型鍊上,然後在增加新的方法增強以前的對象,傳回新的對象。 列印出來是否發現兩個不一樣,一個在原型鍊上,一個在對象的屬性上
基本思想:通過借用函數來繼承屬性,通過原型鍊的混成形式來繼承方法 兩個定義好的函數,用來繼承,并不是用對象來實作繼承,和之前講的混合模式一樣。
http://www.jb51.net/article/75714.htm
http://www.jb51.net/article/81766.htm
javascript:void(0)