javascript继承的几种方法
继承是面向对象编程中很重要的概念,在其它面向对象的语言中大都很简单,例如java中有关键词extends来实现
javascript语言在ES6也新增了extends关键词可以实现继承,用法与java其实大同小异:
class Animal {
constructor(props) {
this.name = props.name
}
eat(){
console.log(`${this.name} 要吃东西`)
}
}
class Dog extends Animal {
constructor(props) {
//调用实现父类的构造函数
super(props);
this.type = props.type
}
run(){
console.log(`${this.name}要跑了`)
}
} const xiaobao = new Dog({name:"xiaobao"})
console.log(xiaobao.eat(),xiaobao.run())
如果不用class 和extends关键词呢?
要实现继承,那么首先要定义一个被继承的父类:
function Animal(name){
this.type = "Animal"
this.array = [1,2,3]
}
Animal.prototype.eat = function(type){
console.log(this.name +"喜欢吃"+type)
}
1.构造函数
利用call/apply方法改变函数上下文实现继承,这种办法有很明显的缺点:不能继承父类的原型的属性或方法
function Dog(name){
Animal.call(this)
this.type = "dog"
this.name = name }
var xb = new Dog("小宝")
xb.type // dog
xb.array // [1,2,3]
xb.eat('骨头') // Uncaught TypeError: (intermediate value).eat is not a function
2.原型链
使子类原型对象指向父类的实例以实现继承,缺点是会共用原型,不能多继承,当有多个实例时数据会共通,这当然不是我们想要的。
function Dog(name){
this.type="dog"
this.name = name
} Dog.prototype = new Animal() var xb = new Dog("小宝")
var dd = new Dog("点点") xb.array // [1,2,3]
dd.array // [1,2,3]
xb.array.push(4) xb.array // [1,2,3,4]
dd.array // [1,2,3,4]
3.组合继承
调用父类构造函数,再使子类原型对象指向父类的实例,缺点是会调用两次父类构造函数
function Dog(name){
Animal.call(this)
this.type="dog"
this.name = name
}
Dog.prototype = new Parent3()
4.组合继承--优化版
将子类的原型指向父类的原型的对象(将父类的原型用Object.create()处理下,将子父的构造函数隔离开,没有这一步将会造成父类的构造函数被覆盖),再修复constructer,将子类构造函数赋给子类的原型的构造函数。
function Dog(name){
Animal.call(this)
this.type="dog"
this.name = name
}
Dog.prototype = Animal.prototype
Dog.prototype = Object.create(Animal.prototype)
Dog.prototype.constructor = Dog
后面两种方式推荐使用,没有什么明显的缺点。
javascript继承的几种方法的更多相关文章
- JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)
JavaScript继承的6种方法 1,原型链继承 2,借用构造函数继承 3,组合继承(原型+借用构造) 4,原型式继承 5,寄生式继承 6,寄生组合式继承 1.原型链继承. <script t ...
- javascript继承的6种方法
1原型式继承 简介:对类式继承的封装,过渡对象相当于子类. function inheritObject(o) { //声明过渡函数对象 function F() {} //过渡对象的原型继承父类 F ...
- Javascript 创建对象的三种方法及比较【转载+整理】
https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...
- 在WebBrowser中执行javascript脚本的几种方法整理(execScript/InvokeScript/NavigateScript) 附完整源码
[实例简介] 涵盖了几种常用的 webBrowser执行javascript的方法,详见示例截图以及代码 [实例截图] [核心代码] execScript方式: 1 2 3 4 5 6 7 8 9 1 ...
- js对象之间的"继承"的五种方法
今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = & ...
- JavaScript数组的22种方法
原文:http://www.cnblogs.com/xiaohuochai/p/5682621.html javascript中数组的22种方法 前面的话 数组总共有22种方法,本文将其分为对象继 ...
- JavaScript继承的几种实现
0 什么是继承 继承就是获得存在对象已有的属性和方法的一种方式. [2019.4.26 更新]今日又重新学习了一下JS的继承,在这里整理一下以前的笔记并补充一些新的感悟. 1 JS中继承的几种实现方法 ...
- javascript继承的三种模式
javascript继承一般有三种模式:组合继承,原型式继承和寄生式继承: 1组合继承:javascript最为广泛的继承方式通过原型链实现对原型属性和方法的继承,通过构造函数实现对实例属性的继承,同 ...
- js(javascript) 继承的5种实现方式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt240 js继承有5种实现方式:1.继承第一种方式:对象冒充 functio ...
随机推荐
- HZOJ Permutation
输出原序列有45分…… 字典序最小可以和拓扑序联系起来. 根据原来的题意不是很可做,于是对原序列求逆,令q[p[i]]=i; 那么就成功将题意转化:相邻元素值的差大于等于k时可以交换,使序列字典序最小 ...
- Android BroadcastReceiver 简介
Android BroadcastReceiver 简介 在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver 活动(A ...
- Xcode编译报错:< Apple Mach-O Linker Warning > clang: error: no such file or directory: 'xxxx'
Xcode编译报错概述: clang: error: no such file or directory: 'CoreGraphics' 一般原因是链接库内容导入丢失,这种的排查下target - B ...
- 设置select和option的文字居中
select{ width: auto; padding: 0 1%; //左右一定要设置 margin: 0; } option{ text-align:center; }
- composer基本使用
一.Composer的安装 1.下载Composer 2.Composer安装 1).Composer安装前请确保已经安装了php:打开命令行窗口输入php -v可以查看php的当前版本号. 3.局部 ...
- PyTorch代码调试利器: 自动print每行代码的Tensor信息
本文介绍一个用于 PyTorch 代码的实用工具 TorchSnooper.作者是TorchSnooper的作者,也是PyTorch开发者之一. GitHub 项目地址: https://github ...
- Pytorch - GPU ID 指定 pytorch gpu 指定
PyTorch 关于多 GPUs 时的指定使用特定 GPU. PyTorch 中的 Tensor,Variable 和 nn.Module(如 loss,layer和容器 Sequential) 等可 ...
- oracle函数 CONCAT(c1,c2)
[功能]连接两个字符串 [参数]c1,c2 字符型表达式 [返回]字符型 同:c1||c2 [示例] select concat('010-','88888888')||'转23' 高乾竞电话 fro ...
- oracle函数 extract(c1 from d1)
[功能]:日期/时间d1中,参数(c1)的值 [参数]:d1日期型(date)/日期时间型(timestamp),c1为字符型(参数) [参数表]:c1对应的参数表详见示例 [返回]:字符 [示例] ...
- Spring Boot 集成日志logback + 控制台打印SQL
一: 控制台打印SQL application.properties中添加如下即可在控制台打印sql logging.level.com.fx.fxxt.mapper=debug 二:日志 因为Spr ...