一 原理

子类的构造函数的原型对象,是父类的构造函数创建的实例。

function Fruit(){
this.name = '水果';
this.nutrition=['维生素','膳食纤维'];
} Fruit.prototype.eat = function(){
console.log('eat');
}; function Mango(){ } // 继承父类的方法
Mango.prototype = new Fruit();
// 修改父类的构造函数的原型对象的constructor属性:
// 父类的实例会继承原型对象的constructor属性,从而父类的实例的constructor属性都指向父类的构造函数。仅此而已。
Mango.prototype.constructor = Mango;
// 添加子类的方法
Mango.prototype.taste = function(){
console.log('taste');
}; let mango1 = new Mango();
let mango2 = new Mango(); // 子类的实例共享原型对象中的属性/方法
console.log(mango1.name,mango2.name); // 水果 水果
console.log(mango1.nutrition === mango2.nutrition); // true
console.log(mango1.eat === mango2.eat) // true // 原型对象中的属性是基础数据类型:不能被子类直接修改
mango1.name = '泰国芒果';
mango2.name = '海南芒果';
console.log(mango1.__proto__.name,mango2.__proto__.name); // 水果 水果
console.log(mango1.name,mango2.name); // 泰国芒果 海南芒果 // 原型对象中的属性是对象类型:可以被子类直接修改。
mango1.nutrition.push('柠檬酸');
console.log(mango2.nutrition); // ["维生素", "膳食纤维", "柠檬酸"] // 原型链
console.log(mango1 instanceof Mango); // true
console.log(mango1 instanceof Fruit); // true

二 优点

拼接了原型链。子类的实例可以从父类继承属性/方法,子类的实例是父类的实例。

三 缺点

1 子类的构造函数无法向父类的构造函数传参。定义子类的构造函数时,继承就确定了,跟子类的构造函数的执行无关。

2 子类的实例共享原型对象的属性/方法,互相干扰。

3 不能实现多继承。 原型对象只能有一个。

JavaScript各种继承方式(一):原型链继承(prototype chaining)的更多相关文章

  1. js继承之组合继承(结合原型链继承 和 借用构造函数继承)

    在我的前两篇文章中,我们已经介绍了 js 中实现继承的两种模式:原型链继承和借用构造函数继承.这两种模式都存在各自的缺点,所以,我们考虑是否能将这二者结合到一起,从而发挥二者之长.即在继承过程中,既可 ...

  2. JS高阶---继承模式(原型链继承)

    [前言] 之前已经介绍了对象创建的五种模式,下面看下继承模式 本节介绍下<原型链继承> [主体] 验证如下: 关键点: .

  3. 【前端知识体系-JS相关】深入理解JavaScript原型(继承)和原型链

    1. Javascript继承 1.1 原型链继承 function Parent() { this.name = 'zhangsan'; this.children = ['A', 'B', 'C' ...

  4. javascript原型与原型链,prototype、__proto__、constructor

    javascript通过构造函数(constructor)和原型链来(prototype chain)实现其他面向对象语言的类概念.ES6语法中引入了“类”(class)的概念,但只是一个语法糖,只是 ...

  5. 深入浅出JavaScript之原型链&继承

    Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instanc ...

  6. 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)

    上一篇介绍了对象创建的几种基本方式,今天我们看分析下对象的继承. 一.原型链继承 1.通过设置prototype指向“父类”的实例来实现继承. function Obj1() { this.name1 ...

  7. javascript中继承(一)-----原型链继承的个人理解

    [寒暄]好久没有更新博客了,说来话长,因为我下定决心要从一个后台程序员转为Front End,其间走过了一段漫长而艰辛的时光,今天跟大家分享下自己对javascript中原型链继承的理解. 总的说来, ...

  8. 《JAVASCRIPT高级程序设计》根植于原型链的继承

    继承是面向对象的语言中,一个最为津津乐道并乐此不疲的话题之一.JAVASCRIPT中的继承,主要是依靠原型链来实现的.上一篇文章介绍过,JAVASCRIPT中,每一个对象都有一个prototype属性 ...

  9. Javascript 组合继承 原型链继承 寄生继承

    Javascript继承通常有三种方式. 第一种:组合式继承: function SuperType(name) { this.name = name; this.colors = ["re ...

  10. 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)

    摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...

随机推荐

  1. AS3 - 对文件和目录的操作

    1,写入到文件 1 2 3 4 5 var fileObj:File = File.documentsDirectory.resolvePath("hangge.txt"); va ...

  2. git异常

    1.  SSL certificate problem: self signed certificate 因git默认是ssl方式验证,在采用http请求时,是使用的账号密码方式,因此需要git放行. ...

  3. 如何使用navicat远程连接服务器上的oracle数据库

  4. docker-compose初试及命令基础

    转自:https://www.cnblogs.com/jsonhc/p/7811929.html 以一个简单的lnmp.yaml的配置文件进行讲解docker-compose命令的基础讲解,熟练掌握命 ...

  5. 【转】【java】论integer是地址传递还是值传递

    转自:http://www.tuicool.com/articles/AraaQbZ 论integer是地址传递还是值传递 Integer 作为传参的时候是地址传递 , 可以参考如下例子,在程序刚启动 ...

  6. 16.Set、List、Queue集合;Map.md

    目录 1.Set 1.2HashSet TreeSet 2.List 2.1ArrayList 2.1.1ArrayList和Vector的区别 2.2LinkedList 3.Queue 4.各种线 ...

  7. unity3d热更新插件uLua学习整理

    前言 IOS不能热更新,不是因为不能用反射,是因为System.Reflection.Assembly.Load 无法使用System.Reflection.Emit 无法使用System.CodeD ...

  8. python基础学习Day8 文件的基本操作

    1.文件的基本操作初识 f = open('a.text', 'r', encoding='utf-8')data = f.read()print(data)f.close() 2.读  r  r+b ...

  9. Pandas基础知识(一)

    Pandas的主要结构有DataFrame和Series. 生成一个Series对象. 关于部分Series的索引操作. Series也可以通过字典生成. DataFrame是一个表格型的数据,它既有 ...

  10. 文字在线转图片二维码的公用API接口

    在线生成网址二维码的API接口: 1.百度网盘(可使用https)       http://pan.baidu.com/share/qrcode?w=150&h=150&url=ht ...