《JavaScript语言精粹》第四章

121 阅读2分钟

chapter 4

对象

函数字面量

 保留字function
 var add = function(a,b){
    return a+b;
}; 

调用

  • 方法调用模式

    myObj有一个value属性和一个increment方法

    var myObj = {  
        value: 0;  
        increment: fun(inc){  
            this.value += typeof inc === 'number' ? inc:1;  
        }  
    };  
    myObj.increment();  
    document.writeln(myObk.value);  //1  
    
  • 函数调用模式

    函数调用时,this被绑定到全局对象,解决方法就是:定义变量赋值为this

    myObj.dou =fun() {
        var that = this; //解决方法
        var helper = fun(){
            that.value = add(that.value,that.value);
        };  
        helper(); //以函数的形式调用  
    };  
    
    //以方法的形式调用dou
    myObj.dou();
    
  • 构造器调用模式

    不太推荐使用

    //创造一个Q的构造器函数
    var Q = fun(string){
        this.status = string;
    };
    
    //给Q所有实例提供一个get_status方法
    Q.prototype.get_status = fun(){
        return this.status;
    };
    
    //构造一个Q实例
    var myQ = new Q("KKKK");
    
  • apply调用模式

    apply方法接受俩个参数,1.this 2.一个参数数组

    var array = [3,4];
    var sum = add.apply(null,array);  //7
    var statusObj = {
        status: 'AAA';
    };
    
    //statusObj没有继承Q.prototype,但是可以在statusObj上调用get_status方法
    var ststus = Q.prototype.get_status.apply(statusObj); //AAAA 
    

参数

  • 函数被调用时,会得到arguments数组,但ta不是一个真正的数组,只有一个length属性,缺少所有数组的方法

返回

  • return

异常

var add = fun(a,b){
    if(typeof a!== 'number' || typeof b!== 'number'){
        throw{
            name:'TypeError',
            message:'add needs numbers'
        };
    }
    return a + b;
}
  • try代码块抛出一个异常,控制权就会跳转到他的catch
var try_it = fun (){
    try{
        add("AA");
    } catch (e){
        document.writeln(e.name+':'+e.message);
    }
}
try_it();

给类型增加方法

Object.prototype添加方法,对函数,数组,字符串,数字,正则表达式和布尔值同样适用

fun.prototype.method = fun(name,func){
    this.protoype[name] = func;
    return this;
};

递归

  • 神仙用法
  • 尾递归优化

作用域

闭包

回调

request = prepare_the_request ();
response = send_request_synchronously( request );
display ( response );

效果更好

request = prepare_the_request ();
send_request_synchronously ( request , fun( response ){
        display ( response );}
);

模块

  • ???

级联

  • 单独的一条语句依次调用同一个对象的很多方法
  • obj().xx().xxx().xxxx().....;

套用

  • 将函数与传递给ta的参数结合去产生一个新的函数
var add1 = add.curry(1);
document.writeln(add1(6));

记忆

  • ???