js 继承的简单易懂小例子
js 继承
今天主要说原型链继承、构造继承、组合继承三种常用继承方式,分享一下我的理解。
原型链继承例子1
//原型继承
function A(name){
this.name = name;
}
function B(){
this.school = "alb"
}
B.prototype = new A();
B.prototype.age = "112";
var b = new B();
console.log(b);
console.log(b.age);
console.log(b.name);
console.log(b.school);
console.log(b instanceof A);
结果如下:

注释:
1、b instanceof A 结果是true 代表b是A原型链上
构造继承例子1
function A(name){
this.name = name;
}
function B(name,age){
A.call(this,name);
this.age = age;
}
var b = new B("lar","12");
console.log(b);
console.log(b.age);
console.log(b.name);
console.log(b instanceof A);
结果如下:

注释:
1、b instanceof A 结果是false 代表b不是A原型链上
原型链继承和构造继承比较
举一个同事和我说的例子:假设一个父类,有100个方法,创建两个个子类实例
原型链继承:
(1)声明阶段:占用空间为1个类名+100个方法名 = 101
(2)创建实例阶段:占用空间为2个类名,加上父类的方法 = 100+2=102
构造继承:
(1)声明阶段:占用空间为1个类名 = 1
(2)创建实例阶段:两个子类分别拥有了父类的100个方法,然后加上1个类名 =100+100+1=201
原型链继承的优点:所以以此得出原型链继承相对构造继承可以节省空间。父类相当于一个公用代码,其他分别进行调用 比每个方法中都重写一遍公共代码好
原型链继承例子2
function A(name){
this.name = name;
this.arr = [];
}
function B(){
}
B.prototype = new A();
var b = new B();
var c = new B();
b.name = "12";
b.arr.push("111111")
console.log(b);
console.log(b.name);
console.log(b.arr);
console.log(c);
console.log(c.name);
console.log(c.arr);
结果如下:

构造继承例子2
function A(name){
this.name = name;
this.arr = [];
}
function B(){
A.call(this);
}
var b = new B();
var c = new B();
b.name = "12";
b.arr.push("111111")
console.log(b);
console.log(b.name);
console.log(b.arr);
console.log(c);
console.log(c.name);
console.log(c.arr);
结果如下:

原型链继承和构造继承比较
现象:改变b实例时,c的arr变化
原型链继承:由于数组是父类引用类对象,指向的内存是父类,所以当其中一个子类改变时,父类自动改变,则另一个子对象也会随之受影响
构造继承:构造继承是已经新创建了一个内存,所以当一个子类改变的时候不会影响到其他子类已经父类
优缺点比较:由此例子可以看出,在这种情况下,构造继承中的两个实例是互不影响的,但是原型链继承由于共用了父类的属性方法,会受影响
组合继承例子1
function A(name){
this.name = name;
this.arr = [];
}
function B(){
A.call(this);
}
B.prototype = new A();
var b = new B()
console.log(b);
结果如下:

注释:
这种情况下的继承是即实现了原型链继承,又实现了构造继承。只是构造继承的会覆盖原型链继承,寻找属性方法会先到构造继承产生的属性中,没有了再找到原型链上
组合继承例子2
function A(name){
this.name = name;
this.arr = [];
}
function B(){
A.call(this);
}
B.prototype = new A();
var b = new B();
var c = new B();
b.name = "12";
b.arr.push("111111")
console.log(b);
console.log(c);
结果如下:

注释:
以上可见这种情况下的继承是最好的,推荐使用这个,唯一的缺点就是生成了两次实例,浪费了空间
js 继承的简单易懂小例子的更多相关文章
- 【转】JS回调函数--简单易懂有实例
JS回调函数--简单易懂有实例 初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function that is ...
- 基于vue-cli、elementUI的Vue超简单入门小例子
- 这个例子还是比较简单的,独立完成后,能大概知道vue是干嘛的,可以写个todoList的小例子. - 开始写例子之前,先对环境的部署做点简单的介绍,其实和Vue官方的差不多. #如若没有安装过vu ...
- JS继承(简单理解版)
童鞋们,我们今天聊聊js的继承,关于继承,平时开发基本用不到,但是面试没有不考的,我就想问,这是人干的事吗? 好吧,迫于社会主义核心价值观,我们今天就来简单说一说js的继承,谁让它是面向对象编程很重要 ...
- js 继承的简单理解
什么是继承 js中的继承就是获取存在对象已有属性和方法的一种方式. 继承一 属性拷贝 就是将对象的成员复制一份给需要继承的对象. // 创建父对象 var superObj = { name:'liy ...
- JS回调函数--简单易懂有实例
版权声明:本文为博主原创文章,转载请注明出处 初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function t ...
- java入门---简介&简单输出小例子&开发前准备
Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出.J ...
- 一个简单的小例子让你明白c#中的委托-终于懂了!
模拟主持人发布一个问题,由多个嘉宾来回答这个问题. 分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类. 作为问题的发布者,Host不知道问题如何解答.因此它只能发布这个事件,将事 ...
- Spring简单的小例子SpringDemo,用于初略理解什么是Spring以及JavaBean的一些概念
一.开发前的准备 两个开发包spring-framework-3.1.1.RELEASE-with-docs.zip和commons-logging-1.2-bin.zip,将它们解压,然后把Spri ...
- js——事件冒泡与捕获小例子
布局代码 #outer{ width: 300px; height: 300px; background: red; } #inner{ width: 200px; height: 200px; ba ...
随机推荐
- HDU 5783 Divide the Sequence (训练题002 B)
Description Alice has a sequence A, She wants to split A into as much as possible continuous subsequ ...
- 暑假练习赛 006 E Vanya and Label(数学)
Vanya and LabelCrawling in process... Crawling failed Time Limit:1000MS Memory Limit:262144KB ...
- Hive中常用的查询命令
日志数据的统计处理在这里反倒没有什么特别之处,就是一些 SQL 语句而已,也没有什么高深的技巧,不过还是列举一些语句示例,以示 hive 处理数据的方便之处,并展示 hive 的一些用法. a) ...
- cloneNode克隆节点在不同浏览器的差异
cloneNode是用于克隆节点的,如果待克隆的节点还有子节点以及自定义属性.添加的有事件,那么克隆时,可以指定是克隆节点本身,还是将其所有子节点信息也克隆进去,这是通过给cloneNode传递一个布 ...
- Cordova使用build命令出错: Could not create the Java Virtual Machine.
这是因为虚拟机内存不足导致的,解决方案如下: _JAVA_OPTIONS=-Xmx512M
- 问题:编译eshoponcontainers失败,提示error:invalid reference format
环境: visual studio 2017 v15.4.2,docker ce Version 17.06.0-ce-win19 (12801) 参考问题页: https://github.com/ ...
- layui + jfinal 实现上传下载
1.需要把jfinal的环境配置好 2.导入相关的库文件 layui的库文件 就是这两个文件需要导入到自己的页面 注意:jfinal总会把路径拦截,所以需要静态文件处理.本人不太懂.就网上找了下,说w ...
- ADO.NET中SqlCommand对数据库操作
我们要不断地进行数据库的读写,那么ExecuteNonQuery(),ExecuteReader()与ExecuteScalar()就是我们在对数据库进行操作时要用到的,下面我来依次认识一下: ...
- 重构手法之Extrct Method(提炼函数)
返回总目录 本节包含3个手法: 1.Extract Method(提炼函数) 2.Inline Method(内联函数) 3.Inline Temp(内联临时变量) Extract Method(提炼 ...
- Python之uuid模块
UUID是128位的全局唯一标识符,通常由32字节的字符串表示. 它可以保证时间和空间的唯一性,也称为GUID,全称为: UUID —— Universally Unique IDentifier P ...