关于原型,原型链,构造函数和实例关系,可以参考上一篇文章

地址:juejin.im/post/5cbfb3…

js 实现继承的方式一:原型链继承

function Father(){this.name = '父亲';
}
Father.prototype.sayName = function(){console.log(this.name);
}
function Child(){}
Child.prototype = new Father();
var child1 = new Child();
child1.sayName();//父亲
复制代码

原型链继承存在的问题

1.父类中的引用类型的属性被所有子类共享; 2.子类不能向父类传递参数

例子:

function Father(){this.names = ['kevi','jack'];
}
function Son(){}
Son.prototype = new Father();
var son1 = new Son();
var son2 = new Son();
son1.names.push('jhs');
console.log(son1.names);//["kevi", "jack", "jhs"]
console.log(son2.names);//["kevi", "jack", "jhs"]
复制代码

js 实现继承的方式二:构造函数绑定法(借用构造函数法)

function Animal(job){this.species = '动物';this.ages = [1,2,3];//父类中存在引用类型的属性this.job = job;
}
function Dog(name,color){this.name = name;this.color = color;
}
//怎么样才能使Dog继承Animal呢?
//重新改写Dog
function Dog(name,color,job){//Animal.apply(this,arguments);//或Animal.call(this,job);this.name = name;this.color =color;
}
let dog1 = new Dog('大毛','黑色','eat');
console.log(dog1.name);//大毛
console.log(dog1.species);//动物
console.log(dog1.job);//eat
dog1.ages.push(4);
console.log(dog1.ages);//[1,2,3,4]
let dog2 = new Dog('二毛','灰色');
console.log(dog2.ages);//[1,2,3]
复制代码

构造函数绑定法的优缺点:

优点: 1.避免了父类中的引用类型的属性被所有子类共享的问题; 2.可以向父类中传参;

缺点: 1.方法或属性定义在构造函数中,不能够复用这些属性或方法;(方法都在构造函数中定义,每次创建实例都会创建一遍方法。) 2.父类在原型中定义的方法对于子类不可见

function Animal(){this.species = '动物';this.sayHello = function(){console.log('hello world');}
}
Animal.prototype.saySpecies = function(){console.log(this.species);
}
function Dog(name,color){this.name = name;this.color = color;
}
//怎么样才能使Dog继承Animal呢?
//重新改写Dog
function Dog(name,color){Animal.apply(this,arguments);//或//Animal.call(this);this.name = name;this.color =color;
}
const dog1 = new Dog('大毛','黑色');
console.log(dog1.name);//大毛
console.log(dog1.species);//动物
dog1.saySpecies();
复制代码

js 实现继承的方式三:组合继承

function Parent(name){this.name = name;this.colors = ['yellow','red','black'];
}
Parent.prototype.sayName = function(){console.log(this.name);
}
function Child(name,age){Parent.call(this,name);this.age = age;
}
Child.prototype = new Parent();
Child.prototype.constructor = Child;let child1 = new Child('kevin',12);
child1.colors.push('blue');
console.log(child1.name);//kevin
console.log(child1.age);//12
console.log(child1.colors);//['yellow','red','black','blue']
child1.sayName();//kevinlet child2 = new Child('jeck',11);
console.log(child2.name);//jeck
console.log(child2.age);//11
console.log(child2.colors);//['yellow','red','black']
child2.sayName();//jeck
复制代码

组合继承的优点和缺点

优点: 1.子类可以向父类传递参数 2.父类中的引用类型的属性不会被所有实例共享 3.父类原型中定义的方法可以被子类继承 4.可以实现方法共享 5.是js实现继承的最常用方法

缺点: 1.两次调用父类构造函数; 一次是:Child.prototype = new Parent(); 另一次是:执行 let child1 = new Child('kevin',12)时候,其实调用了Parent.call(this,name);

js 实现继承的方式四:原型式继承

function createObj(o){function F(){}F.prototype = o;return new F();
}var obj = {name:'kevin',colors:['red','blue','white']
}
var obj1 = createObj(obj);
var obj2 = createObj(obj);
console.log(obj1.name);//kevin
console.log(obj2.name);//kevinobj1.name = 'kkk';
console.log(obj1.name);//kkk
console.log(obj2.name);//kevinobj1.colors.push('green');
console.log(obj2.colors);//["red", "blue", "white", "green"]
//原型式继承中的引用类型的属性也会被共享,和原型链继承相似
复制代码

原型式继承是Object.create()的模拟实现; Object.create(obj,[propertiesObject]); 接受两个参数,第一个参数为新创建对象的原型对象,第二个参数为可选。如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数

const friend = {name:'lili',
}
let f1 = Object.create(friend,{name :{value:'mimo'}
});
console.log(f1.name);
复制代码

原型式继承存在的缺点

1.原型式继承中的引用类型的属性也会被共享,和原型链继承相似

js 实现继承的方式五:寄生式继承

function createObj(o){var clone = Object.create(o);clone.sayName = function(){console.log('你正在使用寄生式继承');}return clone;
}
var obj = {name:'lll'
}
var obj1 = createObj(obj);
obj1.sayName();//你正在使用寄生式继承
复制代码

寄生式继承的缺点

1.通过使用寄生式继承为对象添加方法,不能实现方法的共享,这一点和借用构造函数方式一致

js 实现继承的方式六:寄生组合式继承

我们一般认为组合继承是最常用的继承方式,不过组合继承也有自己的不足之处,那就是两次调用父类的构造函数,一次在创建子类原型的时候,一次在子类构造函数内部;寄生组合式继承就是为了降低调用父类构造函数开销而出现的; 背后的原理就是:不必为了指定子类型的原型而调用父类型的构造函数

function createObj(o){function F(){}F.prototype = o;return new F();
}
function prototype(child,parent){var prototype = createObj(parent.prototype);prototype.constructor = child;child.prototype = prototype;
}//使用
prototype(child,parent);
复制代码

//例子

 function createObj(o){function F(){}F.prototype = o;return new F();};function prototype1(child,parent){var pro = createObj(parent.prototype);pro.constructor = child;child.prototype = pro;};function Parent1 (){this.name='kk';this.age = 12;};Parent1.prototype.say=function(){console.log(this.name);}function Child1(){Parent1.call(this);this.name='ll'}//使用prototype1(Child1,Parent1);var son = new child1();console.dir(son.say());//ll
复制代码

寄生组合式继承的优点

1.只调用了一次父类的构造函数; 2.避免了在子类的原型上创建不必要的,多余的属性; 3.原型链保持不变,因此能够正常使用instanceof 和isPrototypeOf()

转载于:https://juejin.im/post/5cce56af51882541ac5c4fd0

学习js继承的6种方式相关推荐

  1. js 继承的几种方式

    JS继承的实现方式: 既然要实现继承,那么首先我们得有一个父类,代码如下: function Animal(name) {// 属性this.name = name || '小白';// 实例方法th ...

  2. JS 总结之原型继承的几种方式

    在之前的总结中,我们详细分析了原型<JS 总结之原型>,原型很大作用用于模拟继承,这一次,我们来聊原型继承的几种方式. function Person (age) {this.age = ...

  3. 继承有几种方式,分别是什么,想要实现继承可以使用哪些方法

    这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [继承有几种方式 ...

  4. 可以实现继承的几种方式

    继承的几种方式 说起继承,又是一个老生常谈的问题了.今天来讲讲继承的几种方法以及他们的优缺点吧. 源码地址:点击这里 一.原型链继承 原型链继承:通过原型将一个引用类型继承另一个引用类型的属性和方法. ...

  5. MySQL主从原理,基于快速学习一门技术的3种方式!

    根据经验,想要快速学习一门技术有3种方式. 第一种方式是通过代码来理解它的实现,反推它的逻辑. 这种方式的难度很大,而且起点相对高,能够沉浸其中的人非常少,过程相对来说是苦闷的,但如果能够沉下心来看代 ...

  6. Django中Model继承的三种方式

    Django中Model继承的三种方式 Django中Model的继承有三种: 1.抽象继承 2.多表继承 3.proxy model(代理model) 1.抽象继承 第一种抽象继承,创建一个通用父类 ...

  7. JavaScript系列-02 HTML嵌入js代码的第二种方式

    javaScript系列 HTML中嵌入js代码的第二种方式 脚本块的方式 文章目录 javaScript系列 前言 一.了解脚本块的方式 1.1运行规则 二.执行原理 1.编写代码 2.效果 总结 ...

  8. 在HTML 中嵌入 JS 代码的三种方式

    一,在HTML中嵌入JS代码的第一种方式:行间事件 行间事件是指将JavaScript函数写到HTML元素中的执行事件. 1.JavaScript 是一种事件驱动型的编程语言,通常都是在发生某个事件的 ...

  9. JavaScript——关于JavaScript、在HTML中嵌入JS代码的三种方式、变量

    文章目录 JavaScript 01 关于JavaScript 1.1 JS的发展历史 1.2 JS的特性 1.3 JS的组成 1.4 JSP和JS的区别 02 在HTML中嵌入JS代码的三种方式 2 ...

最新文章

  1. 女性程序员大会ghc_在女性科技大会上成为男人的感觉
  2. 一个超干货的3D视觉学习社区
  3. IDLE 放置奇兵 算法 地牢 记录
  4. php 正则匹配字母和数字,正则匹配密码只能是数字和字母组合字符串功能【php与js实现】...
  5. AI产业化应用落地,飞桨三大服务平台帮你开启加速模式
  6. python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串
  7. CVPR 2019 | 基于密集语义对齐的行人重识别模型:有效解决语义不对齐
  8. Android开发常用命令
  9. Linux的shell编程(一)
  10. Python+django网页设计入门(8):网站项目文件夹布局
  11. WebStorm——cocos2d-html5专用IDE
  12. 车牌识别 php,eoLinker-API_Shop_OCR-车牌识别_API接口_PHP调用示例代码
  13. java中charconst_C语言常量
  14. python七大神级插件_Maya神级插件 SOuP 和OpenVDB
  15. 整数逆序输出, 例如输入一个整数12345,输出5 4 3 2 1
  16. 论文笔记之:Co-saliency Detection via A Self-paced Multiple-instance Learning Framework
  17. (二)移动 GPU 和桌面 GPU 的差距有哪些?
  18. AutoCAD 2004-2022 官方简体中文版下载直链
  19. 高级查询组件下拉框联动(三)
  20. 2022到2023基于java+微信小程序毕业设计课题参考

热门文章

  1. 手机连接电脑wifi上网_手机设置无线路由器方法教你一分钟学会WIFI上网(无需电脑)...
  2. 新鲜角度看问题:从Python角度解析Selenium原理
  3. html5中加入音频,在H5场景中插入自定义音频和视频(任意画面)
  4. linux目录文件变化,Linux下监测目录或文件的变化---inotify
  5. C语言餐馆点菜系统设计,order-system 使用c语言设计的餐厅点菜系统 - 下载 - 搜珍网...
  6. k8s selector_Kubernetes 服务选择(selector)
  7. gulp mysql_关于MySQL索引的一点小见解
  8. read .off file in matlab
  9. 1复数与复变函数(一)
  10. 爬虫-爬取感兴趣图片(python code 直接运行)