javascript 学习笔记
2017-04-17 01:16:34
函数
函数的arguments和this
arguments是函数对象中的一个隐藏属性,通过这个属性可以获取相应的参数值,这个属性其实就传递过来的参数,它是一个数组。
    function say(color){
        alert(color) ;   // 结果为1
        for(var cl in arguments){
            alert(color) ;
        } // 结果为1;2;3
    }
    say(1,2,3) ;
    /**
     * arguments这个对象中有个方法callee,arguments.callee(参数)可以反向调用
     * 比如在递归中可以使用此方法,从而不会导致因函数名改变而发生错误
      */
当需要创建一个类时,设置该类的属性和方法需要使用this关键字,次用法类似java的this关键字函数的属性,call,apply
函数有两个重要的属性length和prototype:
length在函数中的作用是获取参数的个数:
    function fn1(){}
    function fn2(a){}
    function fn3(a,b){}
    fn1.length // 0   fn2.length // 1 fn3.length //2
call 函数名.call(对象,参数列表) ;
apply 函数名.apply(对象,参数数组)对象的工厂方式创建和构造函数创建
通过工厂方式创建对象:
在函数中先创建一个对象,然后为这个对象设置属性和方法,再返回这个对象:
function createPerson(name,age){
       var obj = new Object() ;
       obj.name = name ;
       obj.age = age ;
       obj.say = function(){
           alert(this.name+":"+this.age) ;
       }
}
var p = createPerson("zhangsan",23) ;
console.log(typeof p); //始终都是object 无法检测是Person类型(instanceof)通过构造函数方式创建对象:
使用构造函数创建对象跟工厂方式类似,它是的函数名就是对象的类名,属性和方法是用this关键字赋值,对象创建使用new关键字:
  function Person(name,age){
       this.name = name ;
       this.age = age ;
       this.say = function(){
           alert(this.name+":"+this.age) ;
       }
  }
  var p1 = new Person("23",23) ;
  var p2 = new Person("24",24) ;
  alert(p1.say == p2.say) ; // false 由此可见,使用这种方式创建的对象每一个对象里都会存在方法的拷
                                 贝,如果对象行为较多的话,消耗的空间就会很大。
                                如果把方法设置成全局的行为,则可以被window对象调用,破坏了对象的封装特性,如果全局行为较多的话就会充斥着大量的全局代码,显得开发比较混乱js原型对象是一个非常特殊的对象,当一个函数创建后,就会随之产生一个原型对象,当这个函数创建了一个对象,这个对象会指向这个原型对象
- 检测对象是否有prop指向原型:Person.prototype.isPrototypeOf(p) ; // true or false - // 使用基于原型的创建属性和方法,则为对象专属,window对象不能调用 function Person(){ } Person.prototype.name = “zhangsan” ; Person.prototype.age = 23 ; Person.prototype.say = function(){ alert(this.name + this.age) ; } var Person p = new Person() ; p.say() ; // 正常输出 say() ; //报错
- p.hasOwnProperty(“属性名”),检测对象有没有自己设置值: - var p2 = new Person() ; p2.name = "lisi" ; p2.hasOwerProperty("name") // true
- 重写原型的方式: - Person.prototype={ constructor:Person, // 不指定时会指向objcet,因为原型被重写了 name:'', age:'', say:function(){ } }
js对象继承
- 基于原型链的方式继承: - function Parent(){ this.pv = "" ; this.name = "larry" ; } Parent.prototype.show = function(){ alert("parents:"this.name) ; } function Child(){ this.cv = "" ; } Child.prototype = new Parent() ; Child.prototype.name = “yp” ; var child = new Child() ; child.show() // yp
- 基于构造函数的方式继承: 
 略
