2016年1月16日
ES5和ES6中的继承
Javascript中的继承一直是个比较麻烦的问题,prototype、constructor、__proto__在构造函数,实例和原型之间有的复杂的关系,不仔细捋下很难记得牢固。ES6中又新增了class和extends,和ES5搅在一起,加上平时很少自己写继承,简直乱成一锅粥。不过还好,画个图一下就清晰了,下面不说话了,直接上图,上代码。
ES5
ES5中的继承,看图:
function Super() {} function Sub() {} Sub.prototype = new Super(); Sub.prototype.constructor = Sub; var sub = new Sub(); Sub.prototype.constructor === Sub; // ② true sub.constructor === Sub; // ④ true sub.__proto__ === Sub.prototype; // ⑤ true Sub.prototype.__proto__ == Super.prototype; // ⑦ true
ES5中这种最简单的继承,实质上就是将子类的原型设置为父类的实例。
ES6
ES6中的继承,看图:
class Super {} class Sub extends Super {} var sub = new Sub(); Sub.prototype.constructor === Sub; // ② true sub.constructor === Sub; // ④ true sub.__proto__ === Sub.prototype; // ⑤ true Sub.__proto__ === Super; // ⑥ true Sub.prototype.__proto__ === Super.prototype; // ⑦ true
所以
ES6和ES5的继承是一模一样的,只是多了class
和extends
,ES6的子类和父类,子类原型和父类原型,通过__proto__
连接。
标签:ES6 , JavaScript
ES5中的那张图根本没有继承啊,只是创建实例而已。
__proto__呀
继承是指子类继承父类,如同你ES6代码写的那样。ES5那部分只有一个类啊,只是使用原型模式批量创建对象罢了。
其实你写的挺好的,而且ES6的类实质只是ES5的语法糖,背后原理类似,你ES6那里讲的已经很清楚了。我只是觉得ES5那个图与标题不对应..
有道理,ES5里实现继承的方式太多了,我补了一种最简单的
ES5里的“sub.constructor === Sub”即对应图圈4,这里都是误解,这时候实例的constructor指向的是Super才对。
设置原型的时候,把它指回来了
line5[呵呵]
[奥特曼]
继承的时候 为什么要执行这句代码 Sub.prototype.constructor = Sub; ? 0.0
如果不这么做,sub.constructor会指向Super,这显然不科学,因为sub是Sub的实例
Sub.prototype = Object.create(Super.prototype)
个人觉得ES5中这样指定原型要好很多,不会使得不共享的属性出现在原型链中。
function Sub(…args) {
Super.apply(this, …args)
}
再通过上面来继承实例属性。另外直接通过 Sub.prototype.constructor = Sub 指定的constructor属性它的enumerable是true,而Super.prototype.constructor的enumerable是false。
确实,我举那个例子只是和ES6对比下,原本js实现继承的方法就很多
看了下 其实图中应该是不存在4线条的,实例对象自身没有construtor属性,该属性是在原型对象上的,sub.construtor是通过原型链查找到Sub.prototype上的construtor属性指向Sub的,是通过线条2完成的,可通过sub.hasOwnProperty(‘construcor’) === false 得出.
大意了…