JS is JS——编写JS独有风格的JS代码 学习笔记

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      链式表达 声明式编程

命名空间,脱离语言束缚



posted @ 2011-12-24 23:25  顺武  阅读(1832)  评论(0编辑  收藏  举报