《JavaScript设计模式与开发实践》-面向对象的JavaScript
动态类型语言
编程语言按照数据类型大体分为:静态类型语言和动态类型语言。
静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行时,待变量被赋予某个值之后,才会具有某种类型。
在JavaScript中,当我们对一个变量赋值时,显然不需要考虑它的类型,因此JavaScript是一门典型的动态类型语言。
动态类型语言对变量类型的宽容给实际编码带来了很大的灵活性,由于无需进行类型检测,我们可以尝试调用任何对象的任意方法,而无需去考虑它原本是否被设计为拥有该方法。
这一切都建立在鸭子类型的概念上,即如果它走起来像鸭子,叫起来也是鸭子,那么它就是鸭子。
var duck = {
duckSinging: function() {
printf('gagaga');
}
};
var chicken = {
duckSinging: function() {
printf('gagaga');
}
};
var choir = [];
var joinChoir = function(animal) {
if (animal && typeof animal.duckSinging === "function") {
choir.push(animal);
printf("恭喜加入合唱团");
printf("合唱团已有人数" + choir.length);
}
}
joinChoir(duck);
joinChoir(chicken);
由此,实现了动态类型语言中的一个重要原则:面向接口编程,而不是面向实现编程。
多态
多态的实际含义是:同一操作作用域不同的对象上面,可以产生不同的解释和不同的执行结果。
var makeSound = function(animal) {
if (animal instanceof Duck) {
printf('ggaga');
} else if (animal instanceof chicken) {
printf('gegege');
}
}
var Duck = function() {};
var chicken = function() {};
makeSound(new Duck());
makeSound(new chicken());
这段代码确实实现了多态性,但是如何增加一只动物,那么makeSound函数也需要去改动,这显然并不让人满意。
多态背后的思想是将“做什么”和“谁去做及怎样做”分离开来,也就是将“不变的事物”与“可能改变的事物”分离开来。
原型编程范型的一些规则
所有的数据都是对象
要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它
对象会记住它的原型
如果对象无法响应某个请求,它会把这个请求委托给它自己的原型
事实上,JavaScript中的根对象是Object.prototype,它是一个空对象,我们在JavaScript中遇到的每个对象,实际上都是从它克隆而来的。Object.prototype就是它们的原型。
虽然我们经常用new去实例化一个函数,但是在JavaScript中,当使用new运算符来调用函数时,实际上也是先克隆Object.prototype对象,再进行一些其他额外的过程。
我们一直在讨论对象的原型,就JavaScript的真正实现来说,并不能说对象有原型,而应该说对象的构造器有原型。
实际上,虽然JavaScript的对象最初都是又Object.prototype对象克隆而来,但对象构造器的原型并不限于Object.prototype上,而是可以动态指向其他对象。这样一来,当对象a需要借用对象b的能力时,可以有选择性地把对象a的构造器的原型指向对象b,从而达到继承的效果。
var A=function(){};
A.prototype={name:'sven'};
var B=function(){};
B.prototype.new A();
var b=new B();
console.log(b.name);//输出:sven
《JavaScript设计模式与开发实践》-面向对象的JavaScript的更多相关文章
- 《JavaScript设计模式与开发实践》读书笔记-基础知识
笔记内容多摘录自<JavaScript设计模式与开发实践>(曾探著),侵删. 面向对象的JavaScript 1. 动态需要类型和鸭子类型 鸭子类型 如果它走起路来像鸭子,叫起来也是鸭子, ...
- 《Javascript设计模式与开发实践》--读书笔记
第2章 this call apply bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用. bind( ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- JavaScript设计模式与开发实践 - 观察者模式
概述 观察者模式又叫发布 - 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做 ...
- JavaScript设计模式与开发实践 - 策略模式
引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...
- JavaScript设计模式与开发实践 - 单例模式
引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...
- 《javascript设计模式与开发实践》--- (单一职责原则)
看的这本书叫<JavaScript设计模式与开发实践> 先规划一下看书的顺序,基础知识我已经大概的浏览了一遍了,没有留下笔记,以后有时间还会补上.本来打算顺着看的.但是我感觉我很难短时间内 ...
- JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)
说来惭愧,4个多月未更新了.4月份以后就开始忙起来了,论文.毕设.毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写.这段时间在看<Java ...
- 《JavaScript设计模式与开发实践》知识点笔记
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px ...
- 《JavaScript设计模式与开发实践》笔记第一章
第一章 面向对象的JavaScript 动态类型语言和鸭子类型 编程语言按照数据类型大体可以分为两类:静态类型语言.动态类型语言. 静态类型语言:在编译时便已确定变量的类型. 优点: 在编译时就能发现 ...
随机推荐
- win8上装Oracle 12c Client
安装之前要保证已装Microsoft Visual C++ Redistributable 32 bit: http://www.microsoft.com/download/en/details.a ...
- 深入浅出ECharts系列 (二) 折线图
深入浅出ECharts系列(二) 目标 本次教程的目标是实现“折线图堆叠”折线,实现结果如图: 2. 准备工作 a) 首先下载ECharts插件,你可以根据自己的实际需求选择你想要下载 ...
- Java队列实现
队列数组实现:队列长度有限,但是考虑到平时一般都使用有界队列,这应该也不算是个缺点 public class Queue { private Object[] objs; private int he ...
- .NET学习笔记(3) — VisualStudio使用总结
目录 一:VS是什么? 二:VS可以创建什么类型的工程? 三:VS的常用功能? 四:VS都有哪些使用技巧? 五:注意事项 六:资源汇总 一:VS是什么? Microsoft Visual Stud ...
- QQ粘性效果
演示如下 QQ粘性效果.zip
- spring的依赖注入的最常见的两种方法
package com.lsz.spring.action; public class User { /** * set注入 */ private String username; public vo ...
- C#学习笔记5:数据类型与进制转换
1.C#: 8种整形类型.2种用于科学计算的二进制浮点类型.1种用于金融计算的十进制浮点类型. 2.Decimal是一种特殊的浮点类型,能够存储大数字而无表示错误. 常用于货币计算.在表示的所有十进制 ...
- ios错误修改了系统头文件
一.打开终端 二.进入Xcode 输入命令: cd /Users/apple/Library/Developer/Xcode/ 三.打开当前 输入命令: open . 四.将DerivedData ...
- Windows下lex 与 yacc的使用(2)
Windows下lex 与 yacc的使用 ...
- mysql学习笔记3
要用php+mysql 首先要配置环境.现在要先下载wamp(Windows下的Apache+Mysql/MariaDB+Perl/PHP/Python).直接安装就行 可以点下一步的就点下一步,直至 ...