2016第6周一春节

猴年春节,祝大家都身体健康万事如意!
上午起床后去操场跑了万米,花了1小时左右,虽有点累,但任务完成后开心充实,每次运动过后的感觉都不错,但这段时间总是要好多天才能畅快的运动,居然也不知道为什么会那么忙。猴年要养成经常锻炼的习惯。
下午弄半天网络问题,不知道是华数宽带还是无限路由的问题网络总是时好时坏,下了一个360宽带测试小工具,感觉还不错。
今天熟悉重看了JS精华部分内容,摘录如下:

第三章 对象

    javascript的简单类型包括数字、字符串、布尔值、null值和undefined值,其他所有的值都是对象。
    javascript包含一个原型链特性,允许对象继承另一对象的属性。正确的使用它能减少对象初始化的时间和内存消耗。

    3.1对象字面量
如:var person={
        "name":"John",
        "age":18,
        "wife":{
            "name":"Lucy",
            "agen":22
        }
    }
    3.2检索 点表示法或[]表示法。
    3.3更新 对象中的值可以赋值更新,如果已有属性,那么属性值被替换;若没有属性,则该属性会被扩充到对象中。
    3.4引用 对象通过引用传递,他们永远不会被拷贝。(传递的仅仅是地址)
    3.5原型
        (1)每个对象都连接到一个原型对象--Object.prototype这个标准对象。
        (2)原型连接在更新时是不起作用的,当我们改变某个对象的属性值时,不会触及到对象的原型。(只针对于实例属性的修改,对于原型上的引用类型会改变对象的原型)
        (3)原型链只有在检索值的时候用到,当尝试获取某个对象的属性值时,会沿着他的原型链从下到上依次找,直到Object.prototype,如果Object.prototype依然没有该属性,则返回undefined。这个过程称为委托。
        (4)原型关系是一种动态的关系,如果添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。
    3.6反射
        (1)typeof操作符用于确定属性的类型。
        (2)hasOwnProperty对象是否拥有独立的属性,他不会检测原型链上的。
    3.7枚举 for in语句会遍历对象的所有属性,包括原型链上的属性。可以用typeof和hasOwnPropery过滤。
    3.8删除 delete操作符会删除对象的属性,但不会触及原型链上的属性。
    3.9减少全局变量污染  最小化使用全局变量的一个方法是你的应用中只创建唯一一个全局变量。

第四章 函数

    4.1函数对象
        在javascript中函数就是对象,他连接到Function.prototype(该原型对象本身连接到Object.prototype)。
        每个函数对象在创建时也会带有一个prototype属性,他的值中拥有一个constructor属性,constructor属性的值即为该函数的对象。
    4.2函数字面量
var add = function(a,b){
    return a+b;
}
        通过函数字面量创建的函数对象包含一个连到外部上下文的连接,这被称为闭包。他是javascript强大表现力的根基。

    4.3调用
        除了声明时定义的形式参数,每个函数接受两个附加参数:this和arguments(实际参数)。this的值取决于函数调用的模式。javascript一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。

     4.4参数
            函数被调用时,内部自动获得一个arguments数组,通过他可以访问所有函数被调用时的参数列表。arguments并不是一个真正的数组,它只是一个类数组的对象,它拥有length属性,却没有数组的方法。

      4.5返回
      每个函数都有返回值(return),若没有指定,则返回undefined。 以new调用的函数,且返回值不是对象,则返回this(该新对象)。
       
     4.6异常
            javascript也提供了异常处理机制。
var add=function(a,b){
    if(typeof a!=='number'){
        throw{
            'name':'TypeError',
            'message':'add needs numbers'
        };
    }
    return a+b;
}
            throw语句中断函数的执行,抛出一个exception对象,该对象包括一个可识别的异常类型name和一个描述性message。你也可以添加其他属性。该exception对象将传递到一个try语句的catch从句。

    4.9作用域
        javascript没有块级作用域,只有函数级作用域,所以尽量把变量定义在函数的顶部。

    4.10闭包
        函数可以访问他被创建时所处的上下文环境,称为闭包。就是说,内部函数一直保留着对外部函数属性的引用,这个属性会一直存在内存中。
//糟糕的例子
var addHandlers=function(nodes){
    var i;
    for(i;i<nodes.lengh;i++){
        nodes[i].onclick=function(e){
            alert(i);
        }
    }
}
点击任意节点alert的结果都是一样的,即最后一个node值,因为onclick函数一直保持着对i的引用。

//更好的例子
var addHandlers=function(nodes){
    var i;
    for(i;i<nodes.lengh;i++){
        nodes[i].onclick=function(e){   
            return function(e){
                    alert(e);
                }
        }(i)
    }
}
  

第五章 继承

    继承是大多数编程语言非常重要的主题。良好的继承不仅可以使你的系统有逻辑性和层次感,更重要的是可以减少你的代码量和开发成本。

    5.1伪类

        在本节中作者试图隐藏prototype对象,而尽量使用一种类似“类”的方式实现继承,他的做法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Function.prototype.method=function(name,func){
    if(!this.prototype[name]){
        this.prototype[name]=func;
    }
    return this;
}
//通过method方法定义一个inherits方法,目的是隐藏prototype实现继承
Function.method('inherits',function(Parent){
    this.prototype=new Parent();
    return this;
});
 
/*以上是准备工作*/
var Mammal=function(name){
    this.name=name;
}
 
Mammal.prototype.get_name=function(){
    return this.name
}
 
Mammal.prototype.says=function(){
    return this.saying||'';
}
//继承来了,采用的是级联的样式编程,只有一条语句
var cat=function(name){
    this.name=name;
    this.saying='meow';
}.inherits(Mammal).    //继承Mammal
    method('get_name',function(){    //在cat的原型上添加方法
        return this.says()+' '+this.name+' '+this.says();
    });

    这种伪类的方式作者提出了几个缺点:

        1.没有私有环境,所有属性都是公开的。

        2.无法访问super(父类)的方法。    (这点不太理解,构造一个子类的对象不就可以访问了吗?)

        3.如果你在调用构造器时忘记使用new了,危害相当大!所以建议构造器函数用大写字母。

    5.2对象说明符

        就是说构造器在参数设定上,尽量用一个对象,这样能更好的表达出语义。如:

1
2
3
4
5
6
var myobject=maker(f,l,m);    //不好的方式
var myobject=maker({          //比较好的方式
    first:f,
    last:l,
    male:m
});

    5.3原型

        5.1讲的是javascript用“类”的方式实现继承,这一节介绍怎么用原型的方式继承。直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//为Object对象增加一个方法,这个方法的作用实际上是实现了一次对对象的拷贝
if(typeof Object.beget!=='function'){
    Object.beget=function(o){
        var F=function(){};
        F.prototype=o;
        return new F();
    };
}
 
var myMammal={
    name:'xxx',
    get_name:function(){
        this.name;
    },
    says:function(){
        return this.saying||'';
    }
}
 
var myCat=Object.beget(myMammal);//重点来了,这句是实现了对myMammal对象的继承
myCat.name='mimi';
myCat.get_name=function(){
    return this.says()+" "+this.name;
}

    5.4函数化

        这里其实又介绍了一个设计模式--函数化模式,个人感觉跟模块模式差不多,都是在内部定义私有变量、私有方法,然后通过特权方法对外提供访问接口。看个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var mammal=function(spec){
    var that={};
    that.get_name=function(){
        return spec.name;
    }
    that.says=function(){
        return spec.saying||'';
    }
}
var mymammal=mammal({name:'Herb'});
 
var cat=function(spec){
    spec.saying=spec.saying||'meow';
    var that=mammal(spec);//继承父类
    that.get_name=function(){
        return that.says+' '+spec.name;
    }
    return that;
}
var mycat=cat({name:'Joge'});

        若要访问父类的方法,本书作者提供了一种装逼的写法(个人感觉没什么必要)

1
2
3
4
5
6
Object.method('superior',function(name){
    var that=this,method=that[name];
    return function(){
        return method.apply(that,arguments);
    };
});
1
2
3
4
5
6
7
8
9
10
var coolcat=function(spec){
    var that=cat(spec),
        super_get_name=that.superior('get_name');    //调用父类方法get_name
    that.get_name=function(n){
        return 'like '+super_get_name()+' baby';
    }
    return that;
}
var mycoolcat=coolcat({name:'Bix'});
var name=mycoolcat.get_name();    //'like meow Bix meow baby'

第六章 数组

    数组其实没什么好说的,他在javascript中就是一个对象。不同的是数组继承自Array.prototype,而不是Object.prototype。而且数组拥有length属性和很多实用的方法。

    (1)删除数组可以用delete array[2],但这会在下标2的位置产生一个undefined值,长度不变。可以用array.splice(2,1)代替他。

    (2)数组和对象的使用时机:

                当属性名是小而连续的整数时,你应该使用数组。否则,使用对象。    

                检测一个对象是否为数组的方法:

1
2
3
4
5
6
7
var is_array=function(value){
    return value&&
        typeof value==='object'&&
        typeof value.length==='number'&&
        typeof value.splice==='function'&&
        !(value.propertyIsEnumerable('length'));    
}

第十章 优美的特性

    javascript优美的特性包括:

      (1)函数是头等对象:函数是有词法作用域的闭包。

      (2)基于原型继承的动态对象:对象是无类别的。我们可以通过普通的赋值给任何一个对象增加一个新成员元素。一个对象可以从另一个对象继承成员元素。

      (3)对象字面量和数组字面量:这对创建新的对象和数组来说是一种非常方便的表示法。javascript字面量是数据交换格式JSON的灵感之源。

 




posted on 2016-02-08 18:15  时间朋友  阅读(222)  评论(0编辑  收藏  举报

导航