**
大多數瀏覽器的 es5 實現之中,每乙個物件都有__proto__屬性,指向對應的建構函式的prototype屬性。class 作為建構函式的語法糖,同時有prototype屬性和__proto__屬性,因此同時存在兩條繼承鏈。
(1)子類的__proto__屬性,表示建構函式的繼承,總是指向父類。
(2)子類prototype屬性的__proto__屬性,表示方法的繼承,總是指向父類的prototype屬性。
class
aclass
bextendsab
.__proto__ ===
a// true
b.prototype.__proto__ ===
a.prototype // true
上面**中,子類b的__proto__屬性指向父類a,子類b的prototype屬性的__proto__屬性指向父類a的prototype屬性。
這樣的結果是因為,類的繼承是按照下面的模式實現的。
class
aclass
b// b 的例項繼承 a 的例項
object.
setprototypeof(b
.prototype,
a.prototype)
;// b 繼承 a 的靜態屬性
object.
setprototypeof(b
,a);
const b =
newb()
;
《物件的擴充套件》一章給出過object.setprototypeof方法的實現。
object.
setprototypeof
=function
(obj, proto)
因此,就得到了上面的結果。
object.
setprototypeof(b
.prototype,
a.prototype)
;// 等同於
b.prototype.__proto__ =
a.prototype;
object.
setprototypeof(b
,a);
// 等同於
b.__proto__ =
a;
這兩條繼承鏈,可以這樣理解:作為乙個物件,子類(b)的原型(__proto__屬性)是父類(a);作為乙個建構函式,子類(b)的原型物件(prototype屬性)是父類的原型物件(prototype屬性)的例項。
b
.prototype = object.
create(a
.prototype)
;// 等同於
b.prototype.__proto__ =
a.prototype;
ES6中的類(class)和繼承
語法形式 class person showname showage let p1 new person yang 18 console.log p1.showname p1.showage 也可以寫成 const person class class裡面取值函式 getter class裡面設定函...
ES6入門 Class 的繼承
es6 提供了更接近傳統語言的寫法,引入了 class 類 這個概念,作為物件的模板。通過class關鍵字,可以定義類。基本上,es6 的class可以看作只是乙個語法糖,它的絕大部分功能,es5 都可以做到,新的class寫法只是讓物件原型的寫法更加清晰 更像物件導向程式設計的語法而已。傳統物件導...
ES6的class和繼承
二.class 的繼承 function myfun x,y myfun.prototype.function var a newmyfun 1 2 class myfun 類的內部所有定義的方法,都是不可列舉的 object.keys myfun.prototype 1.所有的類都有乙個const...