读Js设计模式笔记

书:设计模式:

第一章:

实现设计模式比较容易, 而懂得应该在什么时候使用什么设计模式则较为困难. 未搞懂设计模式的用途就盲目套用, 是一种不安全的做法. 你应该尽量保证所选用的模式就是最恰当的, 并不要过度牺牲性能.

在Js这类轻灵的语言中, 过度复杂的框架会很快把应用程序拖入泥沼. 你使用的编程风格和选择的设计模式应该与所要完成的具体工作相称.

可使用的继承方式有两种, 原型式继承和类式继承.

Function.prototype.method = function(name, fn) {
	this.prototype[name] = fn;
}


3种原始数据类型: 布尔, 数字, 字符串
一切皆为对象, 除了3种基本数据类型. 即便是这3种数据类型, 在必要的时候也会被自动包装为对象.
并且所有对象都是易变的(mutable). 例如为函数添加属性:
function fn() {};
fn.num = 0;

与对象的易变性相关的还有内省(introspection), 反射(reflection)概念.

var baz = (function(foo, bar) {
	return foo*bar;
})(10, 2);
// baz will equal 20


匿名函数最有趣的用途是用来创建闭包(clusure)
Js具有函数级的作用域, 并且其作用域又是词法性质的(lexically scoped), 这意味着函数运行在定义它的作用域, 而不是在调用它的作用域中.
利用这两个因素就能把变量包裹在匿名函数中加以保护.

var baz;

(function() {
	var foo = 10;
	var bar = 2;
	baz = function() {
		return foo * bar;
	}
})();


baz(); // 因为函数baz定义在这个闭包中, 所以他能访问这两个变量, 即使是在该闭包执行结束后.
// 并且foo, bar会随着 baz一起存在(我是这样想的)
// 返回一个内嵌函数是创建闭包最常用的手段
// 这里外层函数才是闭包吧?


第二章: 接口

Js实现接口的三种方式: 注释法, 属性检查法, 鸭式辨型法.
没有那种技术是完美的, 但三者结合使用基本上可以令人满意.



第三章: 创建对象的基本模式(封装)
预测人们会怎样使用你的代码并不容易, 封装可能会损害类的灵活性, 导致其无法被用于某些你未曾想到过的目的.

1.门户大开型
2.使用下划线表示方法或属性的私有性(多了一种命名规范)
3.使用闭包创建真正的私有成员


3.使用闭包创建真正的私有成员, 弊端:
这种对象创建模式解决了其他模式中的所有问题, 但它也有自己的一些弊端. 在门户大开型和下划线对象创建模式中, 所有方法都创建在原型对象中, 因此不管生成多少对象实例, 这些方法在内存中只存在一份.
而使用闭包对象创建模式, 每生成一个新的对象实例都将为每一个使用方法和特权方法生成一个新的副本. 这会耗费更多的内存, 所以只适宜在真正需要使用成员的场合.
另外, 这种对象创建模式也不利于派生子类, 因为所派生出的子类不能访问超类中的任何私有属性和方法, 故而在Js中使用闭包实现私有成员导致的派生问题被称为"继承破坏封装". 如果你创建的类以后可能需要派生出子类, 那么最好还是采用前两种方式.

封装之弊:
1.测试
2.使用封装意味着不得不与复杂的作用域链打交道, 而这会使错误调试更加困难. 实现私有方法和属性所需的闭包也让它变得更加复杂.


第四章: 继承 (基于类的继承,原型式继承)



你可能感兴趣的:(读书,笔记)