`
fantasybei
  • 浏览: 36717 次
  • 性别: Icon_minigender_1
  • 来自: 农村进沪务工人员
社区版块
存档分类
最新评论

JavaScript: The Good Parts 读书笔记(3)

阅读更多
    第四章主要讲的是Function.
        function有四种调用的pattern,重点是要注意这4种pattern下,function中的this分别指什么。
        1.the method invocation pattern
            function被作为某个对象的property时,我们把这个function叫做method,当在那个对象上调用这个method时,function内部的this就是指的这个对象,例子如下:
var myObject = {
    value: 1,
    increment: function(inc){
        this.value += (typeof inc == 'number' ? inc : 1);
        return this;
    }
};
alert(myObject.increment(3).value);//4

   
        2.the function invocation pattern
            这个就是普通的函数,这时候函数里的this是指global object,浏览器里就是window,这个是javascript设计时候的一个错误,如果是按原来正确的设计,函数中的this应该是被绑定到外层函数的this上,可能你有点不理解我说的意思了,呵呵,那就举个例子吧,如果在script中直接定义一个函数,
function outer(){//code goes here}
, 那么,两种情况下都是一样的,因为outer的外层没有了,就是window。但是如果是这样:
myObject.double = function(){
    var helper = function(){
        this.value = 2 * this.value;
    }
    helper();
}

我的本意是想让内部的函数来帮我做点事,在double中,this是绑定到myObject上的,但是helper里面的this之绑定到window的,怎么办呢?
其实也很简单,把double赋给另一个变量,然后传进去,如下
myObject.double = function(){
    var that = this;
    var helper = function(){
        that.value = 2 * that.value;
    }
    helper();
}


        3.the constructor invocation pattern
            这个也是经常用的,用new去调用一个函数的时候,其实是新创建了一个对象,给它赋一个隐藏的指向构造函数的prototype对象的reference(呵呵,这个有点难表达,不清楚就去看看犀牛书吧),然后把它当作this,去执行这个函数,最后返回这个对象。这个函数一般叫构造函数,构造函数一般把首字母大写,以区别与普通的function。
如下:
function Person(name, age){
    this.name = name;
    this.age = age;
}

但是这种方式有一个问题,构造函数是用来用 new Person();这种方式来调用的,但是如果你不小心没有new, 直接去调用了Person方法,那么,name和age就变成了window的属性了,毕竟这两个名字还好,但是如果取的名字和window原来的属性同名了,或者你原来在window上设置了一些全局变量,那么这种bug将是非常难找出来的。

        4.the apply invocation pattern
            这个也是很简单的一个调用方式,形式如下:
var obj = {value: 3};
var arg = [3];
myObject.increment.apply(obj,arg);



呵呵,看的各位不太好意思了,感觉自己的表达能力太差了,写的自己都有点不太明了。

最后些点自己的理解吧,学javascript也有比较长的时间了,感觉最近基本开始习惯javascript了,我觉得javascript中最重要的是要理解它是基于原型的,弱类型的,

基于原型:classic 的oo都是class-based的,但是javascript是prototype-based的,它更expressive,更灵活,因此如果不深入理解,也比较容易出错。

弱类型: 在像java这样的强类型的语言中,即使我定义两个方法签名完全一样的接口或者类,他们还是不同的类型,相互之间不能转换,比如:
interface A{
    void methodA();
}
interface B{
    void methodA();
}

,而在javascript中,只要你两个对象只要有相同的方法,那就能用一个对象来代替另一个,比如a.xxx();只要我有一个对象有xxx方法,那么我可以用任意的对象来代替a,同样的,灵活,但是不小心也容易犯错。世界总是这么的辩证,没有完美的东西,呵呵


还有就是上面的各种函数调用pattern中的this的绑定的对象,这些搞明白了,其他的基本就是routine work了。

je的插入代码好像不是很好用阿,排版老是搞不好,只能直接在里面敲代码。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics