这是我总结的一张图片,简单的描绘了原型和构造函数、实例间的复杂关系。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}年级'); } }