建立對象的幾種方式

1,使用Object構造函數


var person = new Object();
    
    person.name = "你好";
    
    person.age = 29;

    person.job = "software Engineer";

    person.sayName = function(){
    
      alert(this.name);
    
    }

缺點: 使用同一個接口建立不少對象,會產生大量的重複代碼。javascript

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(); // 程序員

  優勢: 能夠解決上個建立多個類似對象的問題。html

  缺點: 沒法解決對象識別的問題java

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(); //你好

優勢: 具備封裝性,經過構造函數建立的實例能夠共享原型對象上的屬性和方法。
缺點: 沒有私有屬性和方法this

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

優勢: 構造函數用於定義實例的私有屬性,而原型對象用於定義共有屬性和方法,這樣即最大的節省了內存空間,又區別於其餘實例對象。prototype

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開發語言的人code

7,寄生構造函數模式

結構和工廠模式同樣,可是包裹在外面的函數,是構造函數須要 new 一個實例htm

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 高級程序》裏面講解的很清楚,也能夠看個人博文
理解原型對象-構造器和實例的關係

相關文章
相關標籤/搜索