es6 class extends
function MathHandle(x, y){ this.x = x; this.y = y; } MathHandle.prototype.add = function () { return this.x + this.y; } var m = new MathHandle(1,2); console.log(m.add());
第一块是构造函数,第二块是构造函数的一个拓展,下面是将构造函数实例化,最后调用add方法,因为这个原型扩展之后,每个实例都会有这个方法。
class MathHandle{ constructor(x,y){ this.x = x; this.y = y; } add() { return this.x + this.y; } } const m = new MathHandle(1,2); console.log(m.add());
constructor是一个构造器,每个class都有一个constructor。es6中,用class来专门做构造函数的语法其实是有点模拟java,c#的语法,让初学者或后台熟悉一点。下面的add相当于在原型中定义add方法。这里定义class的方法跟js构造函数相比,更加简单。constructor在new的时候立马会执行。
typeof MathHandle // "function"
MathHandle === MathHandle.prototype.constructor // true
m.__proto__ === MathHandle.prototype // true
js的原理知识,能对上class的原理知识,一摸一样
// 动物 function Animal() { this.eat = function(){ console.log('animal eat') } } // 狗 function Dog() { this.bark = function () { console.log('dog bark'); } } // 绑定原型,实现继承 Dog.prototype = new Animal(); // 哈士奇 var hashiqi = new Dog();
继承就是抽象到具象的过程,从高级到低级的一个关系,首先有一个animal,动物是抽象的,然后是狗,再往下是哈士奇,哈士奇是一种狗。每个animal都有eat,动物都要吃。dog有个bark,叫。这两个构造函数比较简单,就是两个函数,里面有个属性。重点是我们把Dog的显示原型赋值成new Animal()。new Animal是出实话一个animal的实例。这样就实现了继承。再去new Dog(),肯定有bark的方法,执行了赋值之后,也有了eat的方法。
class Animal{ constructor(name){ this.name = name; } eat() { console.log(this.name + ' eat') } } class Dog extends Animal { constructor(name) { super(name); this.name = name; } bark() { console.log(this.name + ' bark'); } } const dog = new Dog('哈士奇'); dog.bark(); dog.eat();
Dog.prototype = new Animal() 相当于 class Dog extends Animal。后面跟java非常相似。这样已经继承了原型方法,不用再写.prototype这种。。super(name),也就是说在执行Dog的构造器的时候,我先把Animal的构造器执行一遍。Animal这个构造函数对应 class Animal。Dog这个构造函数,对应 class Dog。