JS设计模式——4.继承(概念)
类式继承
0.构造函数
一个简单的Person类
function Person(name){
this.name = name;
}
Person.prototype.getName = function(){
return this.name;
}
1.原型链实现继承
未封装extend函数继承
继承步骤如下:
step 1:创建继承类的构造函数
step 2:设置继承类的原型链为父类构造函数。
step 3:调整继承类的构造函数。
step 4:创建继承类
function Author(name, books){
Person.call(this, name); //step 1
this.books = books;
}
Author.prototype = new Person(); //step 2
Author.prototype.constructor = Author; // step 3
Author.prototype.getBooks = function(){
return this.books;
};
var author = new Author('ysy',['js desgin']); // step 4
简单封装extend函数继承
function extend(subClass, superClass){
var F = function(){};
F.prototype = superClass.prototype;
subClass.prototype = new F(); // step 2
subClass.prototype.constructor = subClass; // step3
}
这种展示了封装的原理,但是step1并没有封装进来,而最重要的是step1中会产生对Person的耦合。
高级封装extend函数继承
function extend(subClass, superClass){
var F = function(){};
F.prototype = superClass.prototype;
subClass.prototype = new F();
subClass.prototype.constructor = subClass;
subClass.superclass = superClass.prototype;
if(superClass.prototype.constructor == Object.prototype.constructor){
superClass.prototype.constructor = superClass;
}
}
这样在构建子类的构造函数时示例如下:
function Author(name, books){
Author.superclass.constructor.call(this, name);
this.books = books;
}
extend(Author, Person);
原型式继承
0.原型对象
直接定义一个对象即可
var Person = {
name: 'ysy',
getName: function(){
return this.name;
}
}
1.对继承而来的成员的读和写的不对等性
这个其实很好理解,如果在读属性之前还未对继承而来的属性进行赋值操作,那么读的就是super中的属性,而此时写的话,却是对sub中的写。
当然,一旦写过之后,读和写就是对等的了。
这个简单问题就不再给出代码了。如果你不懂,就去彻底了解一下原型链。
2.clone函数
function clone(obj){
function F(){}
F.prototype = obj;
return new F;
}
3.继承的实现
var Author = clone(Person);
Author.books = [];
Author.getBooks = function(){
return this.books;
}
貌似这个继承的实现要简单好多哇。
继承与封装
只有公用和特权成员会被继承下来。
因此,门户大开型式最适合派生自雷的。它们的所有成员都是公开的,因此可以被遗传给子类。如果某个成员需要稍加隐藏,可以用下划线规范。
在派生具有真正的私有成员的类时,特权方法是公用的,可以被继承,因此也就可以访问父类的私有成员,但是我们不能在子类中添加能够直接访问他们的新的特权方法。
掺元类
有一种重用代码的方法不需要用到严格的继承。
他的做法是:先创建一个包含各种通用方法的类,然后再用他扩充其他类。
这种包含通用方法的类就是掺元类。
下面定义一个简单的掺元类:
var Mix = function(){};
Mix.prototype = {
serialize: function(){
var output = [];
for(key in this){
output.push(key+':'+this[key]);
}
return output.join(',');
}
}
augment(Author, Mix);
var author = new Author('Ross', ['js desgin']);
augment其实很简单。他用一个for in将giving class的prototype中的每个成员都添加到receiving class中。
function augment(rclass, gclass){
if(arguments[2]){ //giving more than 3 paras
for(var i=2, len=arguments.length; i<len; i++){
rclass.prototype[arguments[i]] = gclass.prototype[arguments[i]];
}
}else{
for(methodName in gclass.prototype){
if(!rclass.prototype[methodName]){
rclass.prototype[methodName] = gclass.prototype[methodName];
}
}
}
}
上面的方法还可以指明只继承其中的部分成员。
掺元类的重大有点就是可以实现多继承效果,其他的方法就没法了,因为一个对象只能有一个原型对象。
JS设计模式——4.继承(概念)的更多相关文章
- JS设计模式——4.继承(示例)
目的 我们的目的就是编写一个用于创建和管理就地编辑域的可重用的模块化API.它是指网页上的一段普通文本被点击后就变成一个配有一些按钮的表单域,以便用户就地对这段文本进行编辑. 思路 当用户点击时 1. ...
- JS设计模式——7.工厂模式(概念)
工厂模式 本章讨论两种工厂模式: 简单工厂模式 使用一个类(通常是一个单体)来生成实例. 使用场景:假设你想开几个自行车商店(创建自行车实例,组装它,清洗它,出售它),每个店都有几种型号的自行车出售. ...
- js设计模式--------基本概念的理解
1.闭包,前面已经说过,这里不再做说明 2.封装 对于JS而言,他不像java一样存在私有,公有 ,可以让对象在一些细节方面存在差异,降低他们的耦合程度,对数据做一些约束,我们可以更容易调试,封 ...
- JS设计模式(一)
刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ...
- JS创建对象、继承原型、ES6中class继承
面向对象编程:java中对象的两个基本概念:1.类:类是对象的模板,比如说Leader 这个是泛称领导,并不特指谁.2:实例:实例是根据类创建的对象,根据类Leader可以创建出很多实例:liyi,y ...
- JS设计模式一:单例模式
单例模式 单例模式也称作为单子模式,更多的也叫做单体模式.为软件设计中较为简单但是最为常用的一种设计模式. 下面是维基百科对单例模式的介绍: 在应用单例模式时,生成单例 ...
- JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖
JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...
- 前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发
一.ES6语法 ES6中对数组新增了几个函数:map().filter().reduce() ES5新增的forEach(). 都是一些语法糖. 1.1 forEach()遍历数组 forEach() ...
- 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...
随机推荐
- 【PHP】session失效时间
最近用到php中session时,忽然发现php中的session有点让人头疼啊,要设置一个严格的特定时间内过期的session还真不太容易!后来在网上查询时,发现这个问题还真是有点普遍,网上也有关于 ...
- elementUI使用本地变量进行验证,监测不到本地变量的变化 的问题
对于饿了么组件自定义验证规则,组件库文档已经非常详细了:http://element-cn.eleme.io/#/zh-CN/component/form 我这里将验证中固定的值提取出来使用变量进行保 ...
- yarn add & yarn global add
yarn global add & add -D https://yarnpkg.com/zh-Hans/docs/cli/add#toc-commands $ yarn global add ...
- innerHTML与innerText的区别: 前者获取的是dom对象内的所有html元素 后者获取的是dom对象里面的纯文本元素
- React安装React Devtools调试工具
在运行一个React项目的时候浏览器控制台会提醒你去安装react devtools调试工具. Download the React DevTools for a better development ...
- 基于jwt的token验证
一.什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该token被设计为紧凑且安全的,特别适用于分布 ...
- 【BZOJ3563/BZOJ3569】DZY Loves Chinese I/II(随机化,线性基)
[BZOJ3563/BZOJ3569]DZY Loves Chinese I/II(随机化,线性基) 题面 搞笑版本 正经版本 题面请自行观赏 注意细节. 题解 搞笑版本真的是用来搞笑的 所以我们来讲 ...
- 【HDU5919】SequenceII(主席树)
[HDU5919]SequenceII(主席树) 题面 Vjudge 翻译(by ppl) 给一个长度为N的数列A,有m个询问,每次问 数列[l,r]区间中所有数的第一次出现的位置的中位 数是多少 题 ...
- Linux之进程通信20160720
好久没更新了,今天主要说一下Linux的进程通信,后续Linux方面的更新应该会变缓,因为最近在看Java和安卓方面的知识,后续会根据学习成果不断分享更新Java和安卓的方面的知识~ Linux进程通 ...
- windows多线程接口介绍和使用
一windows多线程接口: 1 创建线程 CreateThread 与 _beginthreadex都可以实现创建线程,两个函数的参数 相同, HANDLEWINAPICreateThread( L ...