zoukankan      html  css  js  c++  java
  • 创建对象的几种方式

    1,使用Object构造函数


    	var person = new Object();
    	
    	person.name = "你好";
    	
    	person.age = 29;
    
        person.job = "software Engineer";
    
    	person.sayName = function(){
    	
    	  alert(this.name);
    	
    	}
    

    缺点: 使用同一个接口创建很多对象,会产生大量的重复代码。

    2,工厂模式

       function creatPerson(name,age,job){
        var o = new Object();
        o.name = name;
    
        o.age = age;
    
        o.job = job;
    
        o.sayName = function(){
    
          alert(this.name);
    
        }
    
        return o;
    
      }
    
      var person1 = createPerson("nn",30,"程序员");
    
      var person2 = createPerson("bb",45,"boss");
    
      person1.sayName(); // 程序员
    

      优点: 可以解决上个创建多个相似对象的问题。

      缺点: 无法解决对象识别的问题

    3,构造函数模式##

      function Person(name,age,job){
    
        this.name = name;
    
        this.age = age;
    
        this.job = job;
    
        this.sayName = function(){
    
          alert(this.name);
    
        }
    
      }
    
      var person1 = new Person("Nicholes",34,"Software Engineer");
    
      person1.sayName(); //Nicholes
    

    优点: 自定义的构造函数意味着将来可以将它的实例标识为某一种特定的类型;换句话说就是可以识别对象类型。

    缺点: 每个方法都要在每个实例上重新创建一遍,浪费内存空间。

    4,原型模式

      function Person(){}
    
      Person.prototype.name = "你好";
    
      Person.prototype.age = 23;
    
      Person.prototype.sayName = function(){
    
        alert(this.name);
    
      }
    
      var person1 = new Person();
    
      person1.sayName(); //你好
    

    优点: 具有封装性,通过构造函数创建的实例可以共享原型对象上的属性和方法。
    缺点: 没有私有属性和方法

    5,组合使用构造函数模式和原型模式

      function Person(name,age,job){
    
        this.name = name;
    
        this.age = age;
    
        this.job = job;
    
        this.friends = [];
    
      }
    
      Person.prototype.sayName=function(){
    
        alert(this.name);
    
      }
    
      var person1 = new Person("Nichloas",45,"公务员");
    
      var person2 = new Person("hh",45,"程序员");
    
      person1.friends.push("nij");
    
      person2.friends.push("jiek");
    
      alert(person1.friends); //nij
    
      alert(person2.friends); //jiek
    

    优点: 构造函数用于定义实例的私有属性,而原型对象用于定义共有属性和方法,这样即最大的节省了内存空间,又区别于其他实例对象。

    6,动态原型模式

      function Person(name,age,job){
    
        this.name = name;
    
        this.age = age;
    
        this.job = job;
    
        //方法
    
        if(typeof this.sayName != "function"){
    
          Person.prototype.sayName=function(){
    
            alert(this.name);
    
          }
    
        }
    
      }
    
    	var person = new Person('nh', 19, 'gcs');
    

    优点: 为了适应那些经常使用OO开发语言的人

    7,寄生构造函数模式

    结构和工厂模式一样,但是包裹在外面的函数,是构造函数需要 new 一个实例

       function creatPerson(name,age,job){
        var o = new Object();
        o.name = name;
    
        o.age = age;
    
        o.job = job;
    
        o.sayName = function(){
    
          alert(this.name);
    
        }
    
        return o;
    
      }
    
      var person1 = new createPerson("nn",30,"程序员");
    

    优点: 可以在特殊情况下用来为对象创建构造函数

    8,稳妥构造函数

    类似于寄生构造函数,但是不直接把参数赋值给对象。

       function creatPerson(name,age,job){
    
        var o = new Object();
    
        o.sayName = function(){
    
          alert(name);
        }
    
        return o;
    
      }
    
      var person1 = new createPerson("nn",30,"程序员");
    
        console.log( person1.name ) // undefined
    

    优点:外部无法通过实例对象访问到里面的 属性值。

    总结

    创建对象的方式大概就这些,其中最常用的也是默认的方式是组合模式。其它模式各有优缺点。
    当然,对于原型模式可能有些人不理解,可以去看 《javascript 高级程序》里面讲解的很清楚,也可以看我的博文
    理解原型对象-构造器和实例的关系

  • 相关阅读:
    jquery.js 一个非常不错的本脚库。
    AjaxPro 框架学习 (支持vs2003/vs2005)
    利用HttpResponse来导出excel文件.
    一个比较好的WEB时间控件
    CCR 编写一个不用创建线程,不用考虑资源互斥的多线程程序
    页面优化 .net 版
    [转]window.opener用法
    导出excel文件 解决科学计数法问题
    抽象类和抽象方法的特征和用途
    超强悍的右键菜单
  • 原文地址:https://www.cnblogs.com/zhiyuan-2011/p/4831873.html
Copyright © 2011-2022 走看看