1. 原型链继承 (原型链)

function Parent() {
this.fruits = ['apple', 'orange'];
}
Parent.prototype.sayHello = function () {
console.log('Parent');
}; function Child() {} Child.prototype = new Parent(); let child1 = new Child();
child1.fruits.push('banana');
console.log(child1.fruits); // [ 'apple', 'orange', 'banana' ] let child2 = new Child();
console.log(child2.fruits); // [ 'apple', 'orange', 'banana' ]

特点:被所有的实例共享了引用类型属性


2. 构造函数方式的继承 (call)

function Parent() {
this.fruits = ['apple', 'orange'];
}
Parent.prototype.sayHello = function () {
console.log('Parent');
}; function Child() {
Parent.call(this);
} let child1 = new Child();
child1.fruits.push('banana');
console.log(child1.fruits); // [ 'apple', 'orange', 'banana' ] let child2 = new Child();
console.log(child2.fruits); // [ 'apple', 'orange' ]

特点:

  1. call方法仅仅调用了父级构造函数的属性及方法(私有属性),没有办法调用父级构造函数原型对象的方法(公有属性)
  2. 可以在 Child 中向 Parent 传参
  3. 每次实例化对象都得创建一遍方法,基本无法实现函数复用

3. 组合链继承方式 (原型链 + call)

function Parent(name) {
this.name = name;
this.fruits = ['apple', 'orange'];
}
Parent.prototype.sayHello = function () {
console.log(this.name);
}; function Child(name, age) {
Parent.call(this, name);
this.name = age;
}
Child.prototype = new Parent(); let child1 = new Child();
child1.fruits.push('banana');
console.log(child1.fruits); // [ 'apple', 'orange', 'banana' ] let child2 = new Child();
console.log(child2.fruits); // [ 'apple', 'orange' ]

特点:

  1. 子类的私有属性继承了父类私有属性,子类公有属性也继承了父类的私有属性和公有属性
  2. 父类函数执行了两次

4. 寄生继承 (Object.create 或者是自我实现的Object)

let parent = {
fruits: ['apple', 'orange'],
sayHello: function () {
console.log('hello');
},
}; function parasitic(pro) {
let clone = Object.create(pro);
return clone;
} let child1 = parasitic(parent);
child1.fruits.push('banana');
console.log(child1.fruits); // [ 'apple', 'orange', 'banana' ] let child2 = parasitic(parent);

这里用到了Object.create

特点:

  1. 和原型链继承效果雷同

5. 寄生组合继承(Oject.create + call)

function Parent(name) {
this.name = name;
this.fruits = ['apple','orange'] }
Parent.prototype.sayHello = function () {
console.log(this.name)
} function Child() {
Parent.call(this) }
function parasitic(child,parent) {
let tempObj = Object.create(parent.prototype);
child.prototype = tempObj;
tempObj.constructor = child;
} parasitic(Child, Parent);

特点:

  1. 子类私有属性继承了父类的私有属性,子类公有属性继承了父类公有属性(和组合继承相比更加纯粹干净)

总结: 所以应用的最多应该就是 组合继承和寄生组合继承两种方式了

js继承方式及特征的更多相关文章

  1. JS继承方式详解

    js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现 ...

  2. 经典面试题:js继承方式下

    上一篇讲解了构造函数的继承方式,今天来讲非构造函数的继承模式. 一.object()方法 json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点. fu ...

  3. 经典面试题:js继承方式上

    js不是传统的面向对象语言,那么他是怎么实现继承的呢?由于js是基于原型链实现的面向对象,所以js主要通过原型链查找来实现继承,主要有两大类实现方式,分为基于构造函数的继承,以及非构造函数的继承. 由 ...

  4. js继承方式

    1.原型链 实现的本质是重写原型对象,代之以一个新类型的实例: 给原型添加方法的代码硬顶放在替换原型的语句之后: 不能使用对象字面量查收能见原型方法,这样会重写原型链. 缺点:包含引用类型值的原型属性 ...

  5. js继承方式及其优缺点?

    原型链继承的缺点一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数.借用构造函数(类式继承)借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起.所以我们需要 ...

  6. js 中继承方式小谈

    题外话 前段时间面试中笔试题有这道题目: 请实现一个继承链,要求如下: 构造函数A():构造函数中有consoleA方法,可以实现console.log("a") 实例对象 a:a ...

  7. js的三种继承方式及其优缺点

    [转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...

  8. 重新理解JS的6种继承方式

    写在前面 一直不喜欢JS的OOP,在学习阶段好像也用不到,总觉得JS的OOP不伦不类的,可能是因为先接触了Java,所以对JS的OO部分有些抵触. 偏见归偏见,既然面试官问到了JS的OOP,那么说明这 ...

  9. js两种定义函数、继承方式及区别

    一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function ...

随机推荐

  1. 使用docker搭建最新版本的gitea,并配置HTTPS访问

    使用docker搭建最新版本的gitea,并配置HTTPS访问 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 之前有搭建 ...

  2. 浅读tomcat架构设计和tomcat启动过程(1)

    一图甚千言,这张图真的是耽搁我太多时间了: 下面的tomcat架构设计代码分析,和这张图息息相关. 使用maven搭建本次的环境,贴出pom.xml完整内容: <?xml version=&qu ...

  3. Git上传代码遇到的报错

    Git上传代码遇到的报错 1.git上传代码卡住(Total 7072 (delta 2508), reused 6844 (delta 2376), pack-reused 0) git confi ...

  4. gitlab用户,组,项目权限管控

    前言:gitlab上的权限管控是非常重要的,尤其是很多研发人员开发一个项目.这个是我总结的权限管控. 1.这个是创建项目时开放权限设置   2.这个创建用户设置的权限   3.用户权限,5种类型用户是 ...

  5. kong配置service和route实现简单API代理

    目录 通过konga连接kong实现API接口代理 1. ADD NEW SERVICE 2. ADD ROUTE 3. 验证API 代理 浏览器验证 请求kong api kong使用Admin A ...

  6. Adaptive AUTOSAR 学习笔记 6 - 架构 - 方法论和 Manifest

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf 缩写 AP:AUTOSAR Adap ...

  7. gpasswd简单记录

    gpasswd [option] GROUP 一切都是为了权限 gpasswd常用参数: -a, --add  USER 将user用户加入到组中 -d, --delete  USER 将user用户 ...

  8. Java基础00-集合基础15

    1. 集合基础 1.1 集合概述 1.2 ArrayList构造方法和添加方法 代码示例: 想通过指定索引添加到最后一个位置的话就填写,现有索引的+1,比如3个索引就是4.如果在指定索引的位置添加没有 ...

  9. python函数的坑

    一.默认参数的坑,如果你的默认参数指向的是可变的数据类型,那么你无论调用多少次这个默认参数,都是同一个. def func(a,list=[]): list.append(a) return list ...

  10. Python+Request库+第三方平台实现验证码识别示例

    1.登录时经常的出现验证码,此次结合Python+Request+第三方验证码识别平台(超级鹰识别平台) 2.首先到超级鹰平台下载对应语言的识别码封装,超级鹰平台:http://www.chaojiy ...