1. 程式人生 > >Javascript深入之創建對象的多種方式以及優缺點

Javascript深入之創建對象的多種方式以及優缺點

丟失 創建對象 工廠 pre 使用 OS 不能 屬性和方法 一次

1.工廠模式

function createPerson(name) {
  var o = new Object();
  o.name = name;
  o.getName = function() {
    console.log(this.name)
  };
  return o;
}
var person1 = createPerson(‘kevin‘)

缺點:對象無法識別,因為所以的實例都指向一個原型

2.構造函數模式

function Person(name) {
  this.name = name;
  this.getName = function() {
    console.log(this.name);
  }
}

var person1 = new Person(‘kevin‘)

優點:實例可以識別為一個特定的類型
缺點:每次創建實例時,每個方法都要被創建一次

2.1構造函數模式優化

function Person(name) {
  this.name = name;
  this.getName = getName;
}

function getName() {
  console.log(this.name)
}

var person1 = new Person(‘kevin‘)

優點:解決了每個方法都要被重新創建的問題
缺點:這叫啥封裝...

3.原型模式

function Person(name) {
}

Person.prototype.name = ‘kevin‘;
Person.prototype.getName = function() {
  console.log(this.name);
}
var person1 = new Person()

優點:方法不會重新創建

缺點:1.所有的屬性和方法都共享 2.不能初始化參數

3.1原型模式優化

function Person(name) {

}

Person.prototype = {
  name: ‘kevin‘,
  getName: function(){
    console.log(this.name)
  }
}
var person1 = new Person()

優點:封裝性好一點
缺點:重寫了原型,丟失了 constructor屬性

3.2 原型模式優化

function Person(name) {}
Person.prototype = {
  constructor: Person,
  name:‘kevin‘,
  getName: function() {
    console.log(this.name)
  }
}
var person1 = new Person()

優點:實例可以通過constructor屬性找到所屬構造函數
缺點:原型模式該有的缺點還是有

4. 組合模式

構造函數模式與原型模式雙劍合璧

function Person(name) {
  this.name = name;
}
Person.prototype = {
  constructor: Person,
  getName: function() {
    console.log(this.name)
  }
}
var person1 = new Person()

優點:該共享的共享,該私有的私有,使用最廣泛的方式

缺點: 有的人就是希望全部都寫在一起,即更好的封裝性

4.1 動態原型模式

function Person(name) {
  this.name = name;
  if (typeof this.getName != ‘function‘) {
    Person.prototype.getName = function() {
      console.log(this.name)
    }
  }
}
var person1 = new Person()

註意:使用動態原型模式時,不能用對象字面量重寫原型

解釋下為什麽:

function Person(name) {
  this.name = name;
  if (typeof this.getName != ‘function‘) {
    Person.prototype = {
       constructor: Person,
       getName: function() {
         console.log(this.name)
       }
    }
  }
}

var person1 = new Person(‘kevin‘)
var person2 = new Person(‘marven‘)

person1.getName() // 報錯 並沒有該方法

person2.getName() // 註釋掉上面的代碼,這句是可以執行的

Javascript深入之創建對象的多種方式以及優缺點