首页前端开发JavaScriptJavaScript 实现继承的几种方式

JavaScript 实现继承的几种方式

时间2024-01-31 22:08:02发布访客分类JavaScript浏览720
导读:收集整理的这篇文章主要介绍了JavaScript 实现继承的几种方式,觉得挺不错的,现在分享给大家,也给大家做个参考。 目录构造继承 (借助call实现 原型链继承 (借助原型链实现 组...
收集整理的这篇文章主要介绍了JavaScript 实现继承的几种方式,觉得挺不错的,现在分享给大家,也给大家做个参考。
目录
  • 构造继承 (借助call实现)
  • 原型链继承 (借助原型链实现)
  • 组合继承 (构造继承+原型链继承)
  • 寄生组合继承
  • 额外:借助(Object.create)

非ES6代码实现继承的主流方式主要可以分为:
构造继承、原型链继承、构造继承+原型链继承组合继承、以及在组合继承上衍生出的继承方式。

构造继承 (借助call实现)

实现

function SuPEr(age){
     this.age = age;
 this.say = function(){
 console.LOG(this.age) }
}
function Child(name,age){
     Super.call(this,age) this.name = name;
}
    VAR child = new Child("min",23)console.log(child instanceof Super);
     // falseconsole.log(child instanceof Child);
     // true

优点

(1) 可以实现多继承(call多个父类对象)
(2) 构造函数中可向父级传递参数

缺点

(1) 只能继承父类实例的属性和方法,不能继承原型上的属性和方法
(2) 实例并不是父类的实例,只是子类的实例

原型链继承 (借助原型链实现)

实现

function Super(){
 this.getName = function(){
 console.log(this.name) }
}
function Child(name){
    	this.name = name;
}
    Child.PRototype = new Super();
     // 这里可以传构造参数Child.prototype.constructor = Child;
    var child = new Child("min");
    console.log(child instanceof Super);
     // trueconsole.log(child instanceof Child);
     // trueconsole.log(child.constructor);
     // Child

优点
(1) 父类原型属性与方法,子类都能访问到
(2) 实例是子类的实例,也是父类的实例

缺点
(1) 无法实现多继承 (2) 创建子类实例时,无法向父类构造函数传参

组合继承 (构造继承+原型链继承)

实现

function Super(age){
     this.age = age;
 this.getAge = function(){
     console.log(this.age);
 }
}
function Child(name,age){
     Super.call(this,age) this.name = name;
}
    Child.prototype = new Super(1);
     Child.prototype.constructor = Child;
    var child = new Child("min",23);
    console.log(child instanceof Super);
     // trueconsole.log(child instanceof Child);
     // trueconsole.log(child.constructor);
     // Child

优点
(1) 结合了构造+原型链继承的优点

缺点
(1) Child.prototype = new Super(); 多调用了一次,使得原型对象中存在一些不必要属性,如上面例子中age属性

寄生组合继承

实现

function Super(age){
     this.age = age;
 this.getAge = function(){
 console.log(this.age) }
}
function Child(name,age){
     Super.call(this,age) this.name = name;
}
(function(){
 function Copy(){
}
     Copy.prototype = Super.prototype;
     Child.prototype = new Copy();
}
    )()Child.prototype.constructor = Child;
    var child = new Child("min",23);
    

备注
问:为什么没有直接使用 Child.prototype = Super.prototype;
答:Child.prototype.constructor = Child; 关键代码,上面写Super.prototype 也会变(引用类型,指向同一地址)

优点
(1) 这应该是实现继承最完美的方案了,es6的extends关键字,在babel转换后代码也是通过这种方式实现的继承。

额外:借助(Object.create)

实现

function Super(age){
     this.age = age;
 this.getAge = function(){
 console.log(this.age) }
}
function Child(name,age){
     Super.call(this,age) this.name = name;
}
Child.prototype = Object.create(Super.prototype,{
 constructor:{
 // 构造函数修复 value: Child }
}
    )var child = new Child("min",23);
    console.log(child instanceof Super);
     // trueconsole.log(child instanceof Child);
     // trueconsole.log(child.constructor);
     // Child

以上就是JavaScript 实现继承的几种方式的详细内容,更多关于JavaScript 实现继承的资料请关注其它相关文章!

您可能感兴趣的文章:
  • 原生Javascript实现继承方式及其优缺点详解
  • js中实现继承的五种方法
  • JS继承实现方法及优缺点详解
  • JavaScript类的继承多种实现方法
  • JavaScript使用prototype属性实现继承操作示例
  • 如何利用JavaScript 实现继承

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

继承

若转载请注明出处: JavaScript 实现继承的几种方式
本文地址: https://pptw.com/jishu/594540.html
c++万能头文件是什么? C语言中do while语句的用法是什么?

游客 回复需填写必要信息