基于原型链的继承
示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function Shape() { this.x = 0; this.y = 0; }
Shape.prototype.move = function (x, y) { this.x += x; this.y += y; console.info('Shape moved.'); };
function Rectangle() { Shape.call(this); }
Rectangle.prototype = Object.create(Shape.prototype); Rectangle.prototype.constructor = Rectangle;
|
这里有一个疑问,第二步为什么要用 create
而不是直接用Rectangle.prototype.__proto__=Shape.prototype
呢? 因为__proto__
并不被推荐直接使用,另外这里的 create
是ES6才出现的函数,如果要求必须使用ES5的话,那么第二步以及第三步可以使用以下代码代替:
| var fn = function(){}; fn.prototype = Shape.prototype; Rectangle.prototype = new fn()
|
基于 class 的继承
示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Father { constructor(x, y) { this.x = x; this.y = y; } add() { this.x += this.x; this.y += this.y; console.log(this.x, this.y); } }
class Son extends Father { constructor(x, y, z) { super(x, y); this.z = z; } sonadd() { super.add(); this.z += this.z; console.log(this.x, this.y, this.z); } }
|
注意点:
- 子类必须在
constructor
方法中调用super
方法,否则新建实例时会报错。这是因为子类自己的this
对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。
super
方法的调用必须在constructor
方法的首行。