這是我總結的一張圖片,簡單的描繪了原型和構造函數、實例間的複雜關係。java
let obj = new Object()
, 你能夠發現它天生就帶着__proto__屬性。而__proto__居然和Object.prototype
指向了同一個對象。咱們知道,它就是原型。1.Object.prototype
(即對象的原型)的原型是什麼呢?c++
2.Object.prototype
中的constructor是什麼?有什麼用?es6
let obj = new Object();
建立了一個對象實例obj,那麼再來看看這個,你應該就一目瞭然了3.但你不能人爲constructor指向的必定是構造出當前對象的函數。編程
Object.prototype
指向了原型,而原型的constructor的又指回了Object。實際上這種試驗是無心義的,由於咱們要知道,constructor是提供給實例,用來定位它的構造函數的屬性,而不是給原型自己使用的。4.咱們嘗試更深刻一些?嘗試剖析一下數組對象的相關結構。數組
問題1:Array.prototype.__proto__===?函數
問題2:let arr=[1,2,3]; 屬於對象的方法hasOwnProperty是如何在數組實例上生效的呢?學習
class的默認屬性this
class Person { name = 'Oliver' sayHi = ()=>{ console.log(hi) } }
在class聲明中
經過 =
賦值的屬性,會變成該class實例的屬性默認值;
經過箭頭函數聲明的方法,會掛載到該實例身上,而非class身上。spa
方法的重寫prototype
// Person定義同上 class Child extends Person{ sayHi(){ console.log('I am a child.') super.sayHi() } }
子類重寫父類的方法後,若是還想調用父類的方法,須要使用 super
關鍵字,super上掛載有父類的原始方法。
class vs prototype
// prototype方法 function Person( name, age) { this.name = name, this.age = age } Person.prototype.sayHi = function() { console.log('你好,我叫'+this.name); } //class方法 class Person{ constructor(name,age){ this.name = name; this.age = age; } sayHi(){ console.log('你好,我叫'+this.name); } }
繼承
class Children extends Person{ constructor(name,age,grade){ super(name,age); this.grade = grade; } sayGrade(){ console.log('我今年${grade}年級'); } }