面向对象 ( 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.阅读下面程序,分析是否能编译通过?如果不能, ...
随机推荐
- 201621123037 《Java程序设计》第6周学习总结
作业06-接口.内部类 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多 ...
- java——线性表接口实现
线性表是存储顺序牌类的数据时最常用的数据结构. 实现线性表有两种方式.第一种是使用数组存储线性表的元素.数组是动态创建的.超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素复制到新建的 ...
- 第七周PSP(10.27-11.03)
psp 进度条 项目 细则 总计 代码行数 0 随笔字数 0 知识点 无 累计曲线 饼图
- 【Leetcode】113Path Sum II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- Cmder命令行工具在Windows系统中的配置
一.Cmder简介 Cmder:一款用于Windows系统中,可增强传统cmd命令行工具的控制台模拟器(类似于Linux系统中的终端控制窗口) 特点: 无需安装,解压即用 可使用较多Linux命令,如 ...
- CentOS 7 U盘安装问题解决
最近期待以久的CentOS 7正式版终于发布了,在家里无聊,所以就打算在我的小Y上安装一下,由于笔记本原来有安装Windows 7 操作系统,考虑使用的需求,所以决定安装双系统: 1. ...
- PHP关于传众多参数还是传上下文对象的性能测试
在开发微信公众平台平台的过程中,有这么几个参数总是需要传来传去,$userOpenId,$message,$time. 在整个程序的运行过程中,为了函数方便的处理,将这三个变量一直放在参数列表里.关于 ...
- Android内存泄漏第一课【转】--------(使用单例模式造成的内存泄漏)
使用单例模式造成的内存泄漏 Android的单例模式在我们项目开发中经常会用到,不过使用的不恰当的话也会造成内存泄漏.因为单例的静态特性使得单例的生命周期和应用的生命周期一样长, 这就说明了如果一个对 ...
- [HNOI/AHOI2018]排列 贪心
题面 题解: 把题面的限制换成中文: 如果排在第k位的下标 = 排在第j位的值 ,那么k < j 换一个描述方式: 一个值为x的数要排在第x个数后面. 再换一个描述方式: \(fa[i] = a ...
- [JSOI2009]电子字典 hash
题面:洛谷 题解: 做法....非常暴力. 因为要求的编辑距离最多只有1,所以我们直接枚举对那个位置(字符)进行操作,进行什么样的操作,加入/修改/删除哪个字符,然后暴力枚举hash判断即可, #in ...