js中实现继承的不同方式以及其缺点
1.利用call和apply,借助构造函数
fucntion P(){
this.name = "P";
}
fucntion C1(){
P.call(this);
}
解释一下,P.call(this)的意思,就是将P的上下文指向C的上下文。
那么,什么是上下文呢,比如说,我有一把菜刀,可以用来杀猪,那么这里我就是菜刀的上下文。你没有,但是有一天你也要去杀猪,怎么办,最简单的方式就是向我借,而不是自己去买,向我借就是说菜刀的上下文被指给你了。
call函数和apply都是用来指定上下文的,但是call后面可以传递多个参数,而apply只能用来传递一个参数(也可以多个,不过要写成数组的形式)


好,第一种方式解决了。但是第一种方法是有缺点的,就是子类只能继承构造函数里面的东西,而父类的原型函数上是继承不到的。
2.借助原型链
fucntion P(){
this.name = "P";
}
fucntion C2(){
}
C2.prototype = new P();
var c2 = new C2();
最后一句话的意思,就是将P实例成一个实例对象,然后,将这个对象作为子类的原型对象。
这种方法使用了原型链,但是由于直接绑定了原型函数,导致了一些问题。
fucntion P(){
this.name = "P";
}
fucntion C2(){
}
C2.prototype = new P()
var s1 = new C2();
var s2 = new C2();
//这里,如果我们修改s1的东西
s1.name = "PPPP";
console.log(s2.name);//结果是 PPPP
原因是啥,因为s1和s2都是引用的同样的原型对象,所以,当s1的值修改,实际上就是修改了原型对象的值,因此,s2的值也会修改。很明显,这种方法是很不好的。
3.构造函数+原型链(组合方式)
fucntion P(){
this.name = "P";
}
fucntion C3(){
P3.call(this);
}
C3.prototype = new P();//2
var c3 = new C3();//1
将两种方法的优点结合起来,这就是我们通常的方法。
实际上,这么写,有点小问题,实例化了两次对象(代码中表明了),浪费内存。
优化方式,直接在原型对象层面上进行就可以了,在//2的位置
C2.prototype = P.prototype
ES6中的方法以后再看。
js中实现继承的不同方式以及其缺点的更多相关文章
- js中实现继承的几种方式
首先我们了解,js中的继承是主要是由原型链实现的.那么什么是原型链呢? 由于每个实例中都有一个指向原型对象的指针,如果一个对象的原型对象,是另一个构造函数的实例,这个对象的原型对象就会指向另一个对象的 ...
- JS中的继承方式总结
1. 原型链继承(又称类继承) Child.prototype = new Parent(); function Parent (name, age) { this.name = name; this ...
- 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...
- JS中的继承(上)
JS中的继承(上) 学过java或者c#之类语言的同学,应该会对js的继承感到很困惑--不要问我怎么知道的,js的继承主要是基于原型(prototype)的,对js的原型感兴趣的同学,可以了解一下我之 ...
- js中的继承和重载
js中有三种继承方式:一.通过原型(prototype)实现继承 二.借用构造函数式继承,可分为通过call()方法实现继承和通过apply()方法实现继承 仅仅通过原型继承我们可以发现在实例化子 ...
- JS中的继承(下)
JS中的继承(下) 在上一篇 JS中的继承(上) 我们介绍了3种比较常用的js继承方法,如果你没看过,那么建议你先看一下,因为接下来要写的内容, 是建立在此基础上的.另外本文作为我个人的读书笔记,才疏 ...
- JS中对象继承方式
JS对象继承方式 摘自<JavaScript的对象继承方式,有几种写法>,作者:peakedness 链接:https://my.oschina.net/u/3970421/blog/28 ...
- JS中的继承实现方式
第一种:通过prototype来实现 prototype.html <!DOCTYPE html><html lang="en"><head> ...
- js中的继承
js中继承的实现方式很多,此处给出两种常用方式. <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> ...
随机推荐
- Docker Centos6 下建立 Docker 桥接网络
cd /etc/sysconfig/network-scripts/; cp ifcfg-eth0 ifcfg-br0 vi ifcfg-eth0 //增加BRIDGE=br0,删除IPADDR,N ...
- LVS的NAT模式测试
dir 分别配置ip eth0 :10.222.138.200 eth0:1 10.222.21.190 rs1 eth0 :10.222.138.201 rs2 eth0: 10.222.1 ...
- Sql Server 常用事务处理总结
在数据库操作中,常用事务写法: 1. 通过 @@error 判断一批sql 执行完毕,是否有异常. @@error 为系统变量,每次执行完 sql 都会返回一个数值, 0 表示 执行成功 ,非0 ...
- Java经典编程题50道之三十
有一个已经排好序的数组.现输入一个数,要求按原来的规律将它插入数组中. public class Example30 { public static void main(String[] arg ...
- 菜鸟之旅——.NET垃圾回收机制
.NET的垃圾回收机制是一个非常强大的功能,尽管我们很少主动使用,但它一直在默默的在后台运行,我们仍需要意识到它的存在,了解它,做出更高效的.NET应用程序:下面我分享一下我对于垃圾回收机制(GC)的 ...
- 【转】磁盘I/O那些事
背景 计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的CPU主频早已超过3GHz,内存也进入了普及DDR4的时代.然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时 ...
- TensorFlow4Delphi
https://github.com/hartmutdavid/TensorFlow4Delphi
- CentOS7上安装FTP服务
---------------------------------------------------------------------------------------------------- ...
- hdu 1878 无向图的欧拉回路
原题链接 hdu1878 大致题意: 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个无向图,问是否存在欧拉回路? 思路: 无向图存在欧拉回路的条件:1.图是连 ...
- Centos小白学习
目录 查看机器设备信息 有线网络设置(必须) 设置主机名(必须) 设置sudo用户,一般默认只有root可以使用(必须) yum更新源(必须) 安装完Centos后桌面宽度不能自适应 Centos安装 ...