js:深入继承
/**
* js实现继承:
* 1.基于原型链的方式
* 2.基于伪造的方式
* 3.基于组合的方式
*/
一、基于原型链的方式
function Parent(){
this.pv = "parent";
}
Parent.prototype.showParentValue = function(){
console.log(this.pv);
}
function Child(){
this.cv = "child";
}
//让Child的原型链指向Parent,也就等于完毕了一次继承
Child.prototype = new Parent();
Child.prototype.showChildValue = function(){
console.log(this.cv);
}
var c = new Child();
c.showParentValue(); //parent
c.showChildValue(); //child
/**
*在使用原型链进行继承时,应注意下面问题:
*1.不能在设定了原型链之后,再又一次为原型链赋值
*2.一定要在原型链赋值之后才干加入或者覆盖方法
*/
使用原型链继承的缺点是:
1.无法从子类中调用父类的构造函数,
2.假设父类中存在引用类型。这个引用类型会加入到子类的原型中。假设一个对象改动了这个引用,其他对象的引用同一时候改动
所以一般都不会单纯的使用原型链来实现继承。
二、基于伪造的方式
function Parent(){
this.color = ["red","blue"];
}
function Child(){
//在Child中的this应该是指向Child的对象
//在调用Parent方法的时候,并且this又指向了Child,就等于是:this.color = ["red","blue"];
//也就等于在Child中有了this.color属性,这样也就变向的完毕了继承
Parent.call(this);
//Parent(); 这样的调用方式,仅仅是完毕了函数的调用。根本无法实现继承
}
var c1 = new Child();
c1.color.push = "green";
console.log(c1.color); //red,blue,green
var c2 = new Child();
console.log(c2.color); //red,blue
//可是这依旧不太好,例如以下:
------------------------------------------------------------------------------
function Parent(name){
this.color = ["red","blue"];
this.name = name;
/*this.say = function(){
console.log(this.name);
}*/
}
Parent.prototype.say = function(){
console.log(this.name);
}
function Child(name,age){
/**
* 使用伪造的方式就能够把子类的构造函数參数传递到父类中
* 存在问题:
* 1.因为使用的伪造方式。不会完毕Child的原型指向Parent,所以对Child来说say方法不存在
* 解决方式:
* 将这种方法放到Parent中,使用this来创建
* 可是这又引起前面提到的问题:
* 每一个Child对象都会有一个say,占用空间。所以也不应单独的使用伪造的方式实现继承。
* 因此我们要使用组合的方式来解决问题
*/
this.age = age;
Parent.call(this,name);
}
var c1 = new Child("Leon",13);
var c2 = new Child("Ada",22);
console.log(c1.name+","+c1.age);
console.log(c2.name+","+c2.age);
三、基于组合的方式
组合的方式是:属性通过伪造的方式实现。方法通过原型链的方式实现。
function Parent(name){
this.color = ["red","blue"];
this.name = name;
}
Parent.prototype.ps = function(){
console.log(this.name+",["+this.color+"]");
}
function Child(name,age){
this.age = age;
Parent.call(this,name);
}
Child.prototype = new Parent();
Child.prototype.say = function(){
console.log(this.name+","+this.age+",["+this.color+"]");
}
var c1 = new Child("Leon",22);
c1.color.push("green");
c1.say(); //Leon,22,[red,blue,green]
c1.ps(); //Leon,[red,blue,green]
var c2 = new Child("Ada",23);
c2.say(); //Ada,23,[red,blue]
c2.ps(); //Ada,[red,blue]
原创文章如转载。请注明出处,本文首发于csdn站点:http://blog.csdn.net/magneto7/article/details/25010555
js:深入继承的更多相关文章
- JS对象继承篇
JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person() ...
- js实现继承的5种方式 (笔记)
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
- js实现继承的方式总结
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
- 【09-23】js原型继承学习笔记
js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...
- js实现继承的两种方式
这是面试时面试官会经常问到问题: js的继承方式大致可分为两种:对象冒充和原型方式: 一.先说对象冒充,又可分为3种:临时属性方式.call().apply(): 1.临时属性方式: 当构造对象son ...
- js实现继承
js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...
- 浅谈JS的继承
JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无 ...
- JS类继承常用方式发展史
JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...
- js实现继承的5种方式
js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...
- JS原型继承与类的继承
我们先看JS类的继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
随机推荐
- 如何解决border的重叠问题
我现在在做一个ul列表,然后给每个li加上边框,但是加完了之后,相邻列表的边框就会变成2px,比如第一个li的下边框和第二个li的上边框就会重叠在一起,请问这有什么办法解决一下么? 解决方法是: 试试 ...
- AtCoder Regular Contest 083
C - Sugar Water Time limit : 3sec / Memory limit : 256MB Score : 300 points Problem Statement Snuke ...
- 文件拷贝后无法编辑,用chown修改所有者和分组
文件拷贝后无法编辑,chmod查看权限,发现当前用户不在文件里的所有者或所有组你,需用chwon修改拥有者和分组. 实例1:改变拥有者和群组 chown mail:mail log2012.log - ...
- hdu 2665 划分树模板题(可作为模板)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Unity3D - UGUI的初级应用
添加字体: 把下载好的字体拖拽到Project面板中 - 点击Text组件中Text属性后面的圆点 - 选择刚刚拖拽的字体即可. 创建ToggleGroup(开关组): 1.在Canvas下创建两个T ...
- struts转换器详解
struts转换器:在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制. 一.类型转换的意义 对于一个 ...
- 【Luogu】P2445动物园(最大流)
题目链接 题目本身还是比较水的吧……容易发现是最大流套上dinic跑一遍就好了,并不会超时. 比较不偷税的一点是关于某动物的所有目击报告都符合才能连边……qwqqwqqwq #include<c ...
- UVA11367 Full Tank? 【分层图最短路】
题目 After going through the receipts from your car trip through Europe this summer, you realised that ...
- docker (centOS 7) 使用笔记3 - 修改docker默认的虚拟网址
近日在使用VPN时发现和docker的虚拟网址发生了冲突,都是172.17.0.1,故需要修改docker的默认网址. 1. 当前状态 # ifconfig docker0: flags=<UP ...
- java捕获不到存储过程里面手抛的错误
采用spring的JDBCTemplate来操作增删查改,Basedao执行存储过程的方法如下: 此方法要么返回一个true,要么抛出异常: 现象: 当项目发布于tomcat中时,同样的代码,同样的过 ...