面向对象 ( OO ) 的程序设计——继承
本文地址:http://www.cnblogs.com/veinyin/p/7608282.html
仅支持实现继承,且主要依靠原型链来实现,不过一般会混合构造函数一起实现继承
1 原型链
继承使用原型链进行传递,类似指针一层层向上指向对应原型,构成链状
在使用原型链近似实现继承时,实例中的所有属性和方法都会被继承
// 第一个类型
function Func1(){
this.property = true;
}
// 第一个类型的方法
Func1.prototype.getFunc1Value = function(){
return this.property;
}; // 第二个类型
function Func2(){
this.func2property = false;
} // 第一个类型的实例赋给 Func2.prototype,实现继承 ( 替换原型 )
Func2.prototype = new Func1(); // 为第二个类型增加了新方法
Func2.prototype.getFunc2Value = function(){
return this.func2property;
}; // 为第二个对象创建实例
var out = new Func2(); // 利用该实例访问第一个对象方法、属性及第二个对象的方法、属性
console.log(out.getFunc1Value());
console.log(out.property);
console.log(out.getFunc2Value());
console.log(out.func2property);继承实质为将父对象的替换为子对象的原型
添加新方法或重写,均要放在替换原型语句后面重写是覆盖掉,原先的还在,子对象实例访问到的是重写的,父对象实例访问的是原先的方法
A 是 B 的实例
A instanceof B; //返回 true 或 false
A 是原型
A.prototype.isProptotypeOf(instance); //返回 true 或 false
2 借用构造函数
使用 call() 或 apply() 方法借用超类型 ( 父对象 ) 的构造函数
// 构造函数1
function Func1(){
this.colors = ["red","blue","green"];
} // 构造函数2
function Func2(){
// 借用构造函数1
Func1.call(this);
} // 创建实例
var out2 = new Func2();
out2.colors.push("black"); // 为构造函数2的实例增加一个值
var out1 = new Func1(); // 输出可知每次新建实例均借用构造函数1,值不变
console.log(out1.colors);
console.log(out2.colors);
}
效果如下

3 传递参数
借用构造函数可以在子类型构造函数中向超类型构造函数传递参数
// 构造函数1
function Func1(name){
this.name = name;
} // 构造函数2
function Func2(){
// 借用构造函数1
Func1.call(this,"Cherry");
this.age = 21;
} // 创建实例
var out2 = new Func2(); console.log(out2.name);
console.log(out2.age);

4 组合继承
将原型链和借用构造函数技术组合到一块,发挥二者之长。实质为使用原型链实现对原型属性和方法的继承,通过借用构造函数实现对实例属性的继承
组合继承是最常用的继承方法
5 寄生组合式继承
尽管组合继承已经十分好用了,但是由于会两次调用父类型的构造函数,导致效率较低,故提出了寄生组合式继承,仅调用一次父类型的构造函数,提高效率,是实现基于继承的最有效方式
示例:
function inheritPrototype(subType, superType) {
var prototype = superType.prototype;
prototype.constructor = subType;
subType.prototype = prototype;
}
function SuperType(name) {
this.name = name;
colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function () {
var out1 = document.getElementById("out1");
var p = document.createElement("p");
p.innerHTML = this.name;
out1.appendChild(p);
};
function SubType(name, age) {
SuperType.call(this, name);
this.age = age;
}
inheritPrototype(SubType, SuperType);
SubType.prototype.sayAge = function () {
var out1 = document.getElementById("out1");
var p = document.createElement("p");
p.innerHTML = this.age;
out1.appendChild(p);
};
var out1 = new SuperType("Bob");
var out2 = new SubType("Cherry",21);
console.log(out1);
console.log(out2);
out1.sayName();
out1.sayAge();
out2.sayName();
out2.sayAge();
效果如下,其中父类型构造函数没有 age ,故输出为 undefined

END~~~≥ω≤
面向对象 ( OO ) 的程序设计——继承的更多相关文章
- 面向对象 ( OO ) 的程序设计——创建对象
本文地址:http://www.cnblogs.com/veinyin/p/7608000.html 为了避免大量重复代码产生,可采用以下方法创建对象 1 工厂模式 function createP ...
- 面向对象 ( OO ) 的程序设计——理解对象
本文地址:http://www.cnblogs.com/veinyin/p/7607938.html 1 创建自定义对象 创建自定义对象的最简单方法为创建 Object 的实例,并添加属性方法,也可 ...
- 【转】 面向对象(OO)程序设计
前言 本文主要介绍面向对象(OO)程序设计,以维基百科的解释: 面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发 ...
- 向对象(OO)程序设计
http://www.uml.org.cn/mxdx/201208232.asp 前言 本文主要介绍面向对象(OO)程序设计,以维基百科的解释: 面向对象程序设计(英语:Object-oriented ...
- 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍
面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...
- Python入门之面向对象的多态和继承
本章内容 Python面向对象的多态和继承对比 ========================================= 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的 ...
- 面向对象OO第9-11次作业总结
面向对象OO第9-11次作业总结 1.关于规格化设计的调研程序规格说明:对程序所应满足的要求,以可验证的方式作出完全.精确陈述的文件.“规格说明”一词与其他工业产品的“规格说明书”有相似的含义.不过, ...
- python的面向对象的特性(继承、封装、多态)
创建自已对象就python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象.以及面向对象的概念:继承.封装.多态. 多态: 可对不同类的对象使用同样的操作. 封装:对外部 ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
随机推荐
- CKeditor、CKFinder的安装配置
CKEditor是不集成文件上传与管理功能的,文件上传管理功能被集成在CKFinder中,这是一个收费的商业软件. 如需要文件上传与管理功能建议使用FCKeditor或者手动破解CKFinder. 下 ...
- windows平台下nginx+PHP环境安装
因为日常工作在windows下,为方便在window是下进行PHP开发,需要在windows平台下搭建PHP开发环境,web服务器选择nginx,不过windows版本的nginx性能要比Linux/ ...
- Spring-MVC理解之二:前置控制器
原文链接:http://www.cnblogs.com/brolanda/p/4265749.html 一.前置控制器配置与讲解 上篇中理解了IOC容器的初始化时机,并理解了webApplicatio ...
- DHCP:动态主机配置协议
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP ...
- BZOJ 2157 旅行(树链剖分码农题)
写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v ...
- l洛谷 (水题)P4144 大河的序列
题目戳 Solution: 这题前面都是废话,关键的一句就是本题求的是序列中连续一段的相与值(&)+相或值(|)最大,然后对这个值进行快速幂取模.考虑到两个数相与最大能得到的就是这两个数中的最 ...
- Qt Creator中的3D绘图及动画教程(参照NeHe)
Qt Creator中的3D绘图及动画教程(参照NeHe) http://blog.csdn.net/cly116/article/details/47184729 刚刚学习了Qt Creator,发 ...
- 【模考】2018.04.08 Connection
Description 给定一张N个点M条边的连通无向图,问最少需要断开多少条边使得这张图不再连通. Input 第一行两个整数N,M含义如题所示. 接下来M行,每行两个正整数x,y,表示x和y之间有 ...
- 那个执事,争先:我如何于 2015 年在 Java Web 项目中推动 HTTP/2
2015 年 5 月,HTTP/2 发布. 2015 年第 3 季度,我所在企业的一个战略级客户(而且是第二大客户)说,他们需要在当年年底之前支持 HTTP/2(原因忘了,且与本文无关,从略). 而在 ...
- springboot集成Guava缓存
很久没有写博客了,这段时间一直忙于看论文,写论文,简直头大,感觉还是做项目比较舒服,呵呵,闲话不多说,今天学习了下Guava缓存,这跟Redis类似的,但是适用的场景不一样,学习下吧.今天我们主要是s ...