JS继承 笔记
发布时间:2024-04-23 09:15:11
JS继承
JavaScript中没有类的概念,与类相关的继承的概念更是无从谈起,但是我们可以通过特殊的语法来
模拟面向对象语言中的继承。
在JS中模拟继承有多种方式,其中寄生组合模式是一种比较容易简单的模拟继承模式,下面我们就来
介绍一下用寄生组合模式模拟继承。
JS的继承包括属性的继承和方法的继承,他们分别通过不同的方法来实现。
1属性的继承
属性的继承通过改变函数的执行环境来实现的。而改变函数的执行环境可以使用call()和apply()两种
方法来实现。
我们首先创建一个Animal“类”(因为JS中没有类的概念,这里只是一个模拟,它实际上只是一个
Function函数对象)。
function Animal(name){
this.name=name;
}
再创建一个Lion“类”,“继承”于Animal
function Lion(){
Animal.apply(this, ["狮子"]);
}
这里使用了Animal的apply方法,把Animal的执行环境改成Lion被调用时的执行环境。
这里要解释一下,我们要想使用Lion这个“类”,通常需要new一个Lion。如:
var l = new Lion();
而new关键字是十分伟大的,在上段代码中,new关键字完成了以下几项工作:
1)开辟堆空间,以准备存储Lion对象
2)修改Lion对象本身的执行环境,使得Lion函数的this指向了Lion函数对象本身。
3)调用Lion“类”的“构造函数”,创建Lion对象
4)将Lion函数对象的堆地址赋值给变量l,这个时候l就指向了这个Lion函数对象
所以经过new关键字以后Animal.apply(this, ["狮子"])中的this已经指向了Lion函数对象本身了,所
以这段代码就将Animal函数的执行环境改变成了Lion函数中,相当于以下代码:
function Lion(){
function Animal(name){
this.name=name;
}
}
而此时的this已经是Lion函数对象了所以上段代码进一步相当于:
function Lion(){
this.name=name;
}
这样就给Lion函数对象添加了name属性,也模拟了Lion函数继承于Animal函数的效果。
2方法的继承
在JS中每一个“类”(即函数,注意不是函数对象)都有一个prototype属性,prototype表示该函数
的原型,也表示一个类的成员的集合(通常是方法的集合)。我们可以通过函数的prototype属性来实现方
法的继承。
我们同样首先创建一个Animal“类”:
function Animal(name){
this.name=name;
}
给Animal的原型中加入一个eat方法:
Animal.prototype.eat=function(){
alter("我能吃!~");
}
创建一个Lion“类”,同时完成对Animal“类”的属性的继承
function Lion(){
Animal.apply(this, ["狮子"]);
}
注意下面的代码,我们马上要完成方法的继承了
Lion.prototype=new Animal();
这样就把一个Animal函数对象储存在了Lion的原型中了,Lion也就包含了Animal中的方法了(其实也
包含了属性)。这样就模拟了Lion函数对Animal的继承。


猜你喜欢
- 我开发过几个采集程序,也研究过很多采集程序代码,所以对采集程序的原理还算是稍微有些了解。先说一下采集原理:采集程序的主要步骤如下: 一、获取
- 在使用DB2以来,碰到了几次出现提示SQL1032N错误,每次出错时出错信息大概如下:11/21/2004 22:15:33 0 0 SQL
- 语法:Void header(string $string[,bool $replace=true [, int $http_respons
- 一、下载1、下载安装包mysql下载路径:https://dev.mysql.com/downloads/file/?id=4967452、
- 如下所示:找了好久,今天无意中敲出来了:ctrl+l(小写)全局查找某个变量:ctrl+h我用的Eclipse快捷键来源:https://b
- 在升级批处理sql脚本的时候,由于各种编写的不规范、不可重复执行,我们通常希望在sql脚本出错后不中止,而是执行完成。虽然这些问题可通过编写
- 在Firefox推出3.5后,他增加了许多新的支持,今天抽空将他们整理一下。属性image-renderingtext-renderingi
- 今天刚看到ChinaUI.com新改版的网站,觉得优艾网是越来越漂亮了,这次的变化的确是挺大的。一早大概的看了一下就关了,后来晚上又打开看时
- python封装简介1.效果图:对比一:对比二:2.学习来源代码:# 封装是面向对象的三大特性之一# 封装指的是隐藏对象中一些不希望被外部所
- 今天以前的同学问我关于这方面的SQL语句,我特意记忆一下,毕竟这个也比较常见了select * from (select * from me
- 目录前言1.使用全局统一覆盖2.在.vue文件中修改3.修改组件的style样式4. 参考element-ui官方文档的api疑问总结前言修
- 一、常见反爬机制及其破解方式封禁IP,使用cookie等前面文章已经讲过现在主要将下面的:~ 验证码 —> 文字验证码 —> O
- 本文记录了mysql 5.7.18绿色版下载安装的详细过程1、先下载mysq5.7.18绿色版,然后解压出来,放在一个目录下,我的解压mys
- 文件操作TXT文件读取txt文件读取txt文件全部内容:def read_all(txt): ...: &nbs
- 因为评论有很多人说爬取不到,我强调几点kv的格式应该是这样的:kv = {‘cookie':‘你复制的一长串cookie',
- 总结了部分所学、所听、所看、所问的一些CSS写作经验,书写高效的CSS - 漫谈CSS的渲染效率,它们与渲染效率及所占用
- 首先让我祭出一张数学王子高斯的照片,这位印在德国马克上的神人有多牛呢? 他是近代数学的奠基人之一,与牛顿, 阿基米德并称顶级三大数学家,随便
- 解决办法有很多: 1 . select * from 表 where
- 目录1.根据默认的行列索引操作1.1行删除1.2列删除2.根据自定义的行列索引操作2.1行删除2.2列删除本文介绍Pandas中DataFr
- 后台实时监控服务器的CUP与内存占用率的场景很常见,虽然没做过,但是着手写代码之前我真没想到会花2个多小时才最终实现。网上虽然搜 PHP C