javascript 模式(1)——代码复用
程序的开发离不开代码的复用,通过代码复用可以减少开发和维护成本,在谈及代码复用的时候,会首先想到继承性,但继承并不是解决代码复用的唯一方式,还有其他的复用模式比如对象组合。本节将会讲解多种继承模式以实现代码复用。
- 继承复用-默认模式
- 继承复用-apply函数
- 继承复用-临时构造
继承复用之默认模式:
每个javascript对象都和另一个对象 相关联,而这个对象就是原型(prototype),而原型又可以链接到其他原型行程原型链,如果当前对象不存在类似方法则会沿原型链查找,直到查找为止。继承的默认模式即通过这种原型链的特性实现的。
Person类为基类定义了一些属性和方法
/**
* person 基类
*/
var Person = function () {
this.name = "";
this.age = 0;
this.sex = "";
this.say = function () {
return "my name is" + this.name;
}
} Person.prototype.sayHello = function () {
return "Hello";
}
定义一个空的子函数对象
/**
* 原型继承
*/
var Engineer1 = function () { }
将子对象的原型链中加入父类和父类原型

Engineer1.prototype = new Person();
var enginneer1 = new Engineer1();
enginneer1.name = 'stephen';
console.log(enginneer1.say());
此类继承实现缺点:
不能传递构造的参数:假设person基类中可以接受构造传参,而继承的子类想通过父类构造传递参数则是不可行的。
继承复用-apply函数
apply函数定义:用于调用当前函数functionObject,并可同时使用指定对象thisObj作为本次函数执行时函数内部的this指针引用。通俗的讲,就是将当前函数对象的成员复制到this所引用的函数对象中去。
可以在子类构造中通过apply方法将父类的成员复制到子类中,而且可以通过apply传递参数,而不是绑定原型链,
var Engineer2 = function () {
Person.apply(this);
}
相反由于不是绑定原型链因此如果在父类原型中的方法是不能被继承的 ,如下代码所示
Person.prototype.sayHello = function () {
return "Hello";
}
使用示例
var enginner2 = new Engineer2();
enginner2.name = 'adam';
console.log(enginner2.say());
继承复用-临时构造
上面两种方法各有优劣,但都不完美,默认继承不能传递构造的参数,而通过Apply()函数的构造绑定又不能继承父类原型链的方法,而且有时基类有私有的方法不想被子类继承,以上两种都不能做到。而临时构造函数的方法能得到一个比较完美的解决方案。
首先生成一个临时函数对象,通过原型链共享将临时函数对象的原型链指定为父类原型链(注意这里不是绑定哦),接着将子类的原型链绑定上临时函数的原型链。

var temp = function (){};
temp.prototype = Person.prototype;
Engineer1.prototype = new temp();
var enginner3 = new Engineer1();
enginner3.name = "stphen";
console.log(enginner3.say());
通过上面代码的处理,子对象拥有了临时函数的原型链,却没有继承父类在函数中定义的成员,这样如果想要定义私有的方法则可以在函数定义中,如果想定义可继承方法可在函数prototype中,从而比较完美的解决继承。
小结:
在javascript中实现继承有许多方法,在本节中讲解了三种主要的方法,每种方法继承都有各自的优势和缺点,可以在开发项目时约定使用某一种方式,当然除了继承外还可以使用apply借用某一个方法从而达到复用的目的,毕竟为了使用某一个方法而建立长长的原型链并不是一种可取的方式。
参考内容
《javascript 模式》 stoyan stefanov
javascript 模式(1)——代码复用的更多相关文章
- 初涉JavaScript模式 (13) : 代码复用 【上】
引子 博客断了一段时间,不是不写,一是没时间,二是觉得自己沉淀不够,经过一段时间的学习和实战,今天来总结下一个老生常谈的东西: 代码复用. 为何复用 JS门槛低,故很多人以为写几个特效就会JS,其实真 ...
- 【读书笔记】读《JavaScript模式》 - 函数复用模式之现代继承模式
现代继承模式可表述为:其他任何不需要以类的方式考虑得模式. 现代继承方式#1 —— 原型继承之无类继承模式 function object(o) { function F() {}; F.protot ...
- 【读书笔记】读《JavaScript模式》 - 函数复用模式之类式继承模式
实现类式继承的目标是通过构造函数Child()获取来自于另外一个构造函数Parent()的属性,从而创建对象. 1.类式继承模式#1 —— 默认方式(原型指向父函数实例) function Paren ...
- 常用的JavaScript模式
模式是解决或者避免一些问题的方案. 在JavaScript中,会用到一些常用的编码模式.下面就列出了一些常用的JavaScript编码模式,有的模式是为了解决特定的问题,有的则是帮助我们避免一些Jav ...
- 《JavaScript模式》第6章 代码复用模式
@by Ruth92(转载请注明出处) 第6章:代码复用模式 GoF 在其著作中提出的有关创建对象的建议原则: -- 优先使用对象组合,而不是类继承. 传统模式:使用类继承: 现代模式:"类 ...
- javascript代码复用模式(二)
前面说到,javascript的代码复用模式,可分为类式继承和非类式继承(现代继承).这篇就继续类式继承. 类式继承模式-借用构造函数 使用借用构造函数的方法,可以从子构造函数得到父构造函数传任意数量 ...
- javascript代码复用模式
代码复用有一个著名的原则,是GoF提出的:优先使用对象组合,而不是类继承.在javascript中,并没有类的概念,所以代码的复用,也并不局限于类式继承.javascript中创建对象的方法很多,有构 ...
- 深入理解JavaScript系列(46):代码复用模式(推荐篇)
介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用. 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) { fun ...
- 深入理解JavaScript系列(45):代码复用模式(避免篇)
介绍 任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量 ...
随机推荐
- 仿h5拖拽
在h5中有个拖拽的声明式命令,就如html属性一样,简单强大. 而在网页上拖拽的功能还是需求很大的,所以对这方面应该去仔细了解一下. 所以仿一一下它的实现.只是仿了它的复制一份到目标容器的功能.它还有 ...
- 使用paramiko如何连接服务器?
本文和大家分享的是python开发中使用paramiko连接服务器的方法和步骤,希望通过本文的,对大家学习和使用paramiko有所帮助. ssh连接步骤 1.ssh server建立server p ...
- SSIS 数据源组件的External Metadata和Advanced Property
1,SSIS的组件属性ValidateExternalMetadata 如果一个Destination组件使用的是上游创建的staging table,那么必须设置 ValidateExternalM ...
- Sql Server系列:自定义函数
用户自定义函数可以像系统函数一样在查询或存储过程中调用,可以接受参数.执行操作并将操作结果以值的形式返回.返回值可以是单个标量或结果集. 1. 标量函数 标量函数返回一个确定类型的标量值,对于多语句的 ...
- 深入理解javascript作用域系列第五篇——一张图理解执行环境和作用域
× 目录 [1]图示 [2]概念 [3]说明[4]总结 前面的话 对于执行环境(execution context)和作用域(scope)并不容易区分,甚至很多人认为它们就是一回事,只是高程和犀牛书关 ...
- 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- Android okHttp网络请求之文件上传下载
前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...
- 解决FragmentTabHost切换标题栏变更问题
现在都流行FragmentTabHost布局.但是所有的fragment都是共享一个actionbar,但是我们又想给每个fragment定义自定义的标题栏.百度google了好久也没有找到解决方案. ...
- C语言 第五章 循环结构练习
一.计算15+16+17 …98+99的和 for实现 #include "stdio.h" void main() { //15+16+17 …98+99 ; ;i<=;i ...
- Android Studio的下载和安装教程(从ADT到AS)
之前一直使用的是Android development tools(简称ADT),后来说是google对ADT不再提供支持,然后一直在考虑是否把自己电脑换成Android Studio(简称AS),从 ...