JS is JS
来自程劭非的讲座。。。 地址http://www.infoq.com/cn/presentations/csf-js-style-code
JS 之父 Brandan Eich
My influences were awk,C,HyperTalk,and Self,commined with management orders to "make it look like java "
被管理层命令让他看上去像Java
management 管理者
prototype 来自于Self
Agenda 议程
抽象
1、简化 抽象的方法
将复杂物体的一个或几个特性抽出去,而自注意其他特性的行动或过程
举例:手里的遥控器,不管它用什么材料做,只把它当按钮来使。。。 视而不见
毛主席说:千万不要忘记阶级斗争。
解放前贫农张大伯被地主“钱剥皮”借钱3元,被勒索"月三分“(每月利息是上月的30%)十个月后才还清,被剥削了多少钱利息?
function caculate(){
return 3*Math.pow(1.3,10)-3; //运算,,
} //简化,是抽象的方法
有选择的丢弃或是忘记。 客户要开发的项目,分析出什么是它想要的。
2、归纳
将几个有区别的物体的共同性质或特征,形象的抽取出来或孤立的进行考虑的行动或过程。
抽象的不同取决于你的场景,和你的业务逻辑
例子:美女,在骨科代夫看的是骨头,在我们眼里是另一种。
例子,每个学生分3个苹果,总共要几个?
function totalApples(count) {
return count* count;
}
程序正确,并不一定抽象正确
代码要重构,或觉得差,很大部分因为抽象不对
没想好,或业务在变化
function Apple(){
}
function Kid() {
this.apples = [];
this.recevieApple = function(){
apples.push(apple);
}
}
function Teacher(){
this.dispatchApple = function(kid) {
kid.receiveApple(kid);
kid.receiveApple(kid);
kid.receiveApple(kid);
}
}
function totalApples() {
var kids = [new Kid(),new Kid(),new Kid()];
var teacher = new Teacher();
kids.forEach(function(kid){
});
}
过于具体
JS有三大范式
面向过程抽象
最最基础,最最重要的一种抽象
过程是事种最常见的抽象,但它不完整
程序 = 数据+过程
过程不是一种落后的编程范式
理论上讲,过程不需要要有参数,,,但也可以有
不太关注返回值,只是去改变数据
全局或局部
函数和过程结合
var data1,data2,data3;
function process_main() {
data1 = ;
process1();
process2();
function process1() {
}
function process2(){}
}
面向对象
对象是一个朴素的概念,大约在2-3岁产生
JS中描述独立对象JSON
分类描述对象
function Parent() {
}
function Child(x) {
Parent.call(this);
this.x = x;
}
面向对象 原型
比猫大,头上有个王字, 上树抛异常
跟小孩讲,,好例子。
function Cat() {}
function Triger() {
this.draw("王")
}
Triger.prototype = new Cat();
原型是一种比较随意的代码组织方式,,,不好读,好写. 复用不要求那么高,,它是很快的
原型也可以很严谨, 自律
JS里不需要有new 的,,
原型不是类,共有的原型,
函数式抽象
Lambda 演算
其实就是替换
函数式编程以演算为基础
函数是第一型 Fist Class
能做参数
能做为返回值
能赋值给变量
有直接量
能运行时产生
例子,,,,加法定义乘法
function add(a,b) {
return a +b ;
}
function mul(a,b) {
var r = a;
for (var i = 1;i<b;i++) {
r = add(r,a)
}
return r;
}
闭包 Lexical Closcure 词法性 运行时会被绑定到不同的变量去,赋与不同的含义
好处,,,更加灵活
柯里化 Currying
f(a,b,c)
f(a) ; 抛出异常???
f2 = f(a);
f2 (b,c)
返回一个函数,接受这两个参数
设计函数式API
OO is poor man's closoure
function addEventListener (node ,type ,lisenter) { }
var node = new Node();
var addEventListenerToNode = addEventListener(node);
addEventListenerToNode(type,listener);
函数式和Javascript里的函数不一致,,,它是一种只关注输入输入出的风格
要能用闭包,currying ,一等化
循环也用递归去表达 js 性能跟不上去
引入一些函数式特性
比如排序, 传入一个函数做参数进去,正排返排
创建你独有风格
jQuery 链式表达 声明式编程
命名空间,脱离语言束缚