advance

1.定义命名空间  ->>> 创建一个局部可用的对象,在对象中封装局部作用域内的有用代码.
    命名空间创建了一个新的局部作用域,将其他代码与完全作用域分开。避免命名冲突
 命名空间对象标识符需唯一。
  可以使用姓名或者字头作为名称的一部分,在定义中最好添加程序库的相关信息。
  在javascript中,可以定义一个对象来创建命名空间
         var  someNameSpace={
      someProperty:23,
      someMethod:function(){...}
   }
  定义后,可以使用对象标记法访问属性和方法:someNameSpace.someProperty和someNameSpace.someMethod()。
2.创建一个配置对象
        对象在分布式代码中的另一种常见用途是作为配置工具,可以轻松地在多个项目上使用相同的javascript代码,而不需要找遍大量代码行,编辑具体值。
  配置对象的创建方法:
              定义一个自定义对象,用其属性代表网站专用的设置
 var  CONFIG={
       host:'http://www.example.com',
       errorClass:'error',
    outputElement:'output',
    ...
     };
  以后,其他javascript代码可以引用配置对象里面的配置,如:
   elem.className=CONFIG.errorClass;

3.创建自定义对象
    创建单个自定义对象,只需要创建一个类型为Object的新变量:
 如:
 var  obj={
         name:'xiaowei',
         gender:'male',
   getName:function(){
           return this.name;
           },
   getGender:function(){
            return this.gender;
           }     
      };

4.创建自定义对象的多个实例----->>>使用一个函数作为对象生成器。
    举例:
     //1.使用构造函数构造对象
     function Employee(firstName ,lastName,department)
  {
  this.firstName=firstName;
  this.lastName=lastName;
  this.department=lastName;
  this.getName=function(){
               return this.firstName+' '+this.lastName;
               }
  };
  //2.使用new运算符生成对象(必须使用new)
     var  e1=new Employee('Jane','Doe','Acounting');//new一个Employee对象
     var  e2=new Employee('John','Smith','Human Resouse');//new 另外一个Employee对像
   注意:为了与javascript中其他对象表现一致,可以自定义对象的同时,定义toString()和valueOf()方法。

5.javascript原型
    javascript是不同类型的面向对象语言,它是原型化的。意味着:所创建的对象继承自一个预定义模型(原型),而不是类定义。
 每个javascript对象都继承其原型中的属性和方法。
 原型链概念--->>> 举例说明:e1对象基于Employee原型,而Employee原型由基于Object,这种现象称为原型链。
           --->>>我们引用任何对象的属性和方法,javascript遍历原型链,寻找对应属性。
     --->>>javascript在到达根原型时停止遍历(Object原型为根原型),如果原型链中没有找到对应属性和方法,则返回undefined。
 为了区分对象内定义,还是原型链中的属性和方法,可以调用hasOwnProperty()方法,以需要区分的属性作为参数,(此方法在Object中已定义,因而所以对象都将继承)
   如:
   var  test={
             thing:1  
         };
    test.hasOwnProperty('thing');//返回true
    test.hasOwnProperty('valueOf');//返回false
    添加原型方法:在javascript中,可以编辑对象的protype属性来修改原型的属性和方法
     如:下面添加一个新的方法
     function Employee(firstName ,lastName,department)
  {
  this.firstName=firstName;
  this.lastName=lastName;
  this.department=lastName;
  this.getName=function(){
               return this.firstName+' '+this.lastName;
               }
  };
  Employee.prototype.getNameBackwards=function(){//添加的原型方法。现在所有new 的Employee对象都可以使用此方法
  return this.lastName+','+this.firstName; 
  }

 追溯式修改原型的能力,甚至能修改内建于javascript的对象定义,如String.下面的代码为String添加一个trim()方法(如果String中还没有这个方法)
    if(typeof String.prototype.trim='undefined'){//创建向后兼容的对象
          String.prototype.trim=function(){
    return this.replace(/^s+|s+$/g,'');
    };
    }
  注意:尽管javascript允许修改原型,但原型的修改是全局的,会影响原型所有的实例,所以需谨慎使用
     如果只需在特定实例上使用一个函数,可以单独创建该函数,以该对象为参数调用它:    
  function  doSomeThing(obj){
      // Do  something with  obj;
   }
   也可以将函数定义添加到单个实例:
    var  obj={};
    obj.doSomeThing=function(){
           //Do  something with  this;   
          }

7.使用闭包
    闭包是与其创建时所在作用域绑定的函数。这意味着:闭包函数可以使用函数创建时(在同一个作用域)已有的变量。
     粗略的说,可以在一下情形可能遇到闭包:
    ①在一个函数中定义另一个函数
    ②内部函数引用存在于外部函数中的变量(包括外部函数的参数)
    ③内部函数在外部函数运行停止后被调用
 举例说明:
      window.onload=function(){
          //设置变量,包含变量tasks
    document.getElementById('theForm').onsubmit=function(){
    tasks.push(t);   
    };    
   };
   onload函数只被调用一次:在页面加载时,该函数定义了tasks数组,
        在常规的非闭包的情况下,函数变量执行就不再可用,意味着tasks数组将在onload函数执行完后所有命令之后不再存在。
   在onload外部函数中定义另一个函数创建了闭包。所有闭包都要求在另一函数中定义,内部函数处理表单提交,将被调用许多次,
   但是调用的时间总是在外部函数结束执行之后。

原文地址:https://www.cnblogs.com/xiaowei-blog/p/3949738.html