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 ...
随机推荐
- selenium 图片上传
WebElement file = driver.findElement(By.name("filename")); 给此元素设置值:file.sendKeys("E: ...
- nodeJs学习-05 案例:http/fs/querystring/url
const http = require('http'); const fs = require('fs'); const querystring = require('querystring'); ...
- Spring集成Hessian1
Hessian是一个轻量级的远程调用工具,采用的是Binary RPC协议,很适合于发送二进制数据,基于HTTP具有防火墙穿透能力.Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们 ...
- Vue.js 第5章 webpack配置
为什么我们需要打包构建工具:因为我们以后做项目的时候,会使用到很多种不同的工具或者语言,这些工具或者语言其实浏览器并不支持 webpack 是一个现代 JavaScript 应用程序的模块打包器(mo ...
- HZOJ 那一天我们许下约定
比较好想的一道题,只是那个组合数比较恶心. 先说一下我最开始想的$n^4$的沙雕dp: 设f[i][j][k]为前i天给了j个,第i天给了k个,则f[i][j][k]=∑f[i-1][j-k][o]; ...
- Android本地数据存储: ASimpleCache
一:前言 在上一篇博客Android本地数据存储: Reservoir 博客中,我提到,除了Reservoir库,还可以采用ASimpleCache开源库,来实现本地数据存储.昨天并没有仔细的对比Re ...
- 安装 NodeJ Koa2、3 + 独立插件 cli脚手架 npm cnpm Vue
安装 NodeJ npm cnpm Koa2.3 + 独立插件 cli脚手架 Vue 安装 在 这里写过了 这两个分开了写 Nodej:下载 node.js 安装 10.0版 ...
- 模板——伸展树 splay 实现快速分裂合并的序列
伸展操作:将treap中特定的结点旋转到根 //将序列中从左数第k个元素伸展到根,注意结点键值保存的是原序列id void splay(Node* &o, int k) { ] == NULL ...
- H3C RIP路由表的更新
- java 获得Class对象
如何得到各个字节码对应的实例对象? 每个类被加载后,系统会为该类生成对应的Class对象,通过Class对象可以访问到JVM中的这个类, 3种方式: 1.调用某个类的class属性获取Class对象, ...