JavaScript各种继承方式(一):原型链继承(prototype chaining)
一 原理
子类的构造函数的原型对象,是父类的构造函数创建的实例。
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)的更多相关文章
- js继承之组合继承(结合原型链继承 和 借用构造函数继承)
在我的前两篇文章中,我们已经介绍了 js 中实现继承的两种模式:原型链继承和借用构造函数继承.这两种模式都存在各自的缺点,所以,我们考虑是否能将这二者结合到一起,从而发挥二者之长.即在继承过程中,既可 ...
- JS高阶---继承模式(原型链继承)
[前言] 之前已经介绍了对象创建的五种模式,下面看下继承模式 本节介绍下<原型链继承> [主体] 验证如下: 关键点: .
- 【前端知识体系-JS相关】深入理解JavaScript原型(继承)和原型链
1. Javascript继承 1.1 原型链继承 function Parent() { this.name = 'zhangsan'; this.children = ['A', 'B', 'C' ...
- javascript原型与原型链,prototype、__proto__、constructor
javascript通过构造函数(constructor)和原型链来(prototype chain)实现其他面向对象语言的类概念.ES6语法中引入了“类”(class)的概念,但只是一个语法糖,只是 ...
- 深入浅出JavaScript之原型链&继承
Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instanc ...
- 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)
上一篇介绍了对象创建的几种基本方式,今天我们看分析下对象的继承. 一.原型链继承 1.通过设置prototype指向“父类”的实例来实现继承. function Obj1() { this.name1 ...
- javascript中继承(一)-----原型链继承的个人理解
[寒暄]好久没有更新博客了,说来话长,因为我下定决心要从一个后台程序员转为Front End,其间走过了一段漫长而艰辛的时光,今天跟大家分享下自己对javascript中原型链继承的理解. 总的说来, ...
- 《JAVASCRIPT高级程序设计》根植于原型链的继承
继承是面向对象的语言中,一个最为津津乐道并乐此不疲的话题之一.JAVASCRIPT中的继承,主要是依靠原型链来实现的.上一篇文章介绍过,JAVASCRIPT中,每一个对象都有一个prototype属性 ...
- Javascript 组合继承 原型链继承 寄生继承
Javascript继承通常有三种方式. 第一种:组合式继承: function SuperType(name) { this.name = name; this.colors = ["re ...
- 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)
摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...
随机推荐
- android的体系结构
android 体系结构:采用软件堆层的架构 ,四层1应用程序“: 提供一系列的核心应用程序 2应用程序框架 :提供安卓平台基本的管理功能和组件重用机制activityManager 管理应用程序的生 ...
- echarts图表--统计图表
echarts官网图表API:http://echarts.baidu.com/index.html
- javascript:控制一个元素高度始终等于浏览器高度
window.onresize = function(){ this.opHtight()} //给浏览器添加窗口大小改变事件window.onresize = function(){ this.op ...
- golang使用Nsq(转)
为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯.一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golan ...
- Visual SVN Server备份脚本
set tt=%date:~0,4%%date:~5,2%%date:~8,2% mkdir D:\SVN_BACKUP_%tt%\Repositories xcopy C:\Repositories ...
- SED命令用法整理
sed '/Started/'q 匹配到Started字符串则退出sed命令 sed '/Started/{/in/q}' 同时匹配到Started和in两个字符时则退出sed命令 ------- ...
- Haskell语言学习笔记(84)Concurrent
Control.Concurrent Prelude> import Control.Concurrent Prelude Control.Concurrent> Control.Conc ...
- datagridview表头全选
参与程序http://www.codeproject.com/KB/grid/CheckBoxHeaderCell.aspx 这里老外写的一个控件,他少了委托重载的一个方法.先写一个控件 public ...
- 吴裕雄 python 爬虫(4)
import requests user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, li ...
- 网络传输中利用fastjson将复杂嵌套数据类型Json格式转换(GeoJsonPolygon)
如果一个对象太复杂了,那么在网络传输键的JSON格式数据转换容易出问题. 比如下面一个类Area.java import lombok.AllArgsConstructor; import lombo ...