JS 中的继承小结
构造超类
function Super() { this.name = "AA" } Super.prototype.getName = function () { console.log(this.name) };
1.原型继承
让子类的原型指向超类的一个实例,就会拥有实例私有的属性。通过实例的 __proto__ 找到超的原型,里面的属性和方法一样可以找到。即 var sub=new Sub(); sub 拥有 Super 的私有和原型上的属性和方法。
核心理念:通过 增加 sub 子类和 super 超类之间的原型链链接,让 Sub 的实例能找到 Super 的原型和私有属性,以后 Super 的原型上添加方法。sub 依然可以找到
function Sub() {} Sub.prototype=new Super(); var sub = new Sub(); console.log(sub.name); sub.__proto__.name = 'BB'; sub.getName(); console.log(Sub.prototype); var sub1 = new Sub(); console.log(sub1.name); console.dir(sub.__proto__);
2.call 继承
只会继承私有的,实例化的时候调用父类的构造函数
function Sub() { Super.call(this); } var sub = new Sub(); console.log(sub.name)
3. 对象冒充继承
实例化的时候,把父级私有的公有的都遍历出来,都加到子级的实例私有属性上。没有原型链的联系
function Sub() { var super1 = new Super; for(var key in super1){ this[key] = super1[key]; } super1 = null; } var sub = new Sub(); console.log(sub.name); sub.getName();
4.组合继承
我们的 cal l继承,继承了私有的。缺少公有的方法。那我们可以用 call+原型继承 来实现公有属性的继承。 好处是私有的还在实例的私有属性上,每一个实例都有自己的。通过原型链也可以找到公有的属性。缺点是原型上多了一份私有的属性。 超级的构造函数也执行了两次
5. 中间类继承
一种在 超类和 子类加了一层原型链的方式 .当然只是继承原型上的方法,也就是公有的。 最坑的地方就是不兼容 不然用这个 + call继承 可以完美实现 继承
function Sub() {} Sub.prototype.__proto__ = Super.prototype; var sub = new Sub(); console.log(sub.getName);
6. 寄生组合
综合以上的继承方法,我们想实现那种 私有的属性是私有的,公有的就在原型上。只能用 组合式的继承来实现。把共享的属性、方法用原型链继承实现,独享的属性、方法用借用构造函数实现,所以组合继承几乎完美实现了 js 的继承。
但是一个 bug 就是 原型上多了 私有的属性。而且让超类构造函数执行两次。
现在的 ECMAscript 提供了一个 方法, Object.create(proto,[propertiesObject]),返回一个对象。该对象的原型 指向 Super.prototype
function Sub() {} Sub.prototype = Object.create(Super.prototype); console.log(Sub.prototype); 这样子类就继承了超类 公有的方法
但是 ES5 兼容性 我们需要自己写一个 Objectcreate 方法
function objectCreate(o) { function Temp() {} Temp.prototype = o; return new Temp(); } function Sub() {} Sub.prototype = objectCreate(Super.prototype); var sub = new Sub; console.log(sub.getName)
我创建一个仅用于 封装继承的函数 用这个当做 Super 类的副本 实现共享原型,但是由于这个 副本 不会被操作,也就不用担心 超类的原型被修改。然后让子类 去继承这个副本的原型。 创建一个实例,让子类的原型指向这个实例。即实现了原型链的继承,还不会影响超类的原型。 而且以后调用 父类的构造函数了,只需要执行这个副本函数。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: redux 入门之三大原则
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
可以更新一波了:
class extends
,util.inherits