關(guān)于JS的new

通常我們創(chuàng)建一個自定義對象可以使用以下兩種方法

  1. 使用對象字面量
var obj = {name: 'nany',  sex: 'female', run: function(){ /* do something  */ }}
  1. 使用構(gòu)造函數(shù)
var obj = new Object()
obj.name = 'nany'
obj.sex = 'female'

以第一種方法為例(為啥不選第二種?就不選第二種?。?dāng)我們需要創(chuàng)建100個有run方法的對象時,那么我們需要這樣寫:

var person1 = {
  name: 'nany',
  sex: 'female', 
  run: function(){ 
    // do something  
  }
}
var person2 = {
  name: 'lily',
  sex: 'female', 
  run: function(){ 
    // do something  
  }
}
......
var person100 = {
  name: 'jack',
  sex: 'male', 
  run: function(){ 
    // do something  
  }
}

是不是感覺沒有愛了?我只有一個run方法想和你一樣竟然要寫這么多代碼,不能忍,為了解決這個寫很多遍重復(fù)代碼的問題,機智的程序員提出了一種設(shè)計模式:工廠模式

function createPerson(name, sex){
  var person = new Object()
  person.name = name
  person.sex = sex
  person.run = function(){
     // do something  
  }
  return person
}
var person1 = createPerson('nany', 'female')
var person2 = createPerson('jack', 'male')

現(xiàn)在你總不會說代碼多又重復(fù)了吧?每個有不同的屬性值又都有run方法,JS之父看我們又是寫var 又是return的,為了讓我們再少些幾行代碼,給我們提供了new這個關(guān)鍵字,同時我們使用了this

function Person(name, sex){
  this.name = name
  this.sex = sex
  this.run = function(){
     // do something  
  }
}
var person1 = new Person('nany', 'female')
var person2 = new Person('jack', 'male')

在這里new幫我們做了如下的事情:

  1. 不用顯示的創(chuàng)建對象,因為 new 會幫你做(使用「this」就可以訪問到臨時對象);
  2. 直接將屬性和方法賦給了this對象
  3. 不用 return 對象,因為 new 會幫你做;

這個模式被稱為構(gòu)造函數(shù)模式,按照慣例,構(gòu)造函數(shù)始終都應(yīng)該以一個大寫字母開頭,并且使用new操作符來創(chuàng)建構(gòu)造函數(shù)的實例。

那么問題又來了,我們不需要每次創(chuàng)建對象的時候再重寫run方法,因為我們發(fā)現(xiàn)
person1.run === person2.run // false,我們想要person1的run和person2的run是一樣的,這樣就沒必要每次創(chuàng)建person的時候重復(fù)創(chuàng)建run方法了,而用原型鏈可以解決這個問題

Person.prototype = {       
  run: function(){
    // do something
  }
}

注意:如果重新給Person.prototype賦值,那么你的 constructor 屬性就沒了,所以需要這么寫

Person.prototype = {
  constructor: Person
  run: function(){
    // do something
  }
}

或者這么寫

Person.prototype.run = function(){
  // do something
}

至此,整個代碼是這樣的

function Person(name, sex){
  this.name = name
  this.sex = sex
}
Person.prototype.run = function(){
  // do something
}
var person1 = new Person('nany', 'female')
var person2 = new Person('jack', 'male')

這個模式被稱為原型模式,在這里new 總共幫我們做了如下的事情:

  1. 不用顯示的創(chuàng)建對象,因為 new 會幫你做(使用「this」就可以訪問到臨時對象);
  2. 直接將屬性和方法賦給了this對象;
  3. 不用 return 對象,因為 new 會幫你做;
  4. 不用綁定原型,new指定原型的名字為 prototype;

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,898評論 18 399
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,141評論 2 17
  • 套路深深深幾許,十面埋伏,教訓(xùn)無從數(shù)。城漂蝸居拼搏處,霾重不見搬磚路。 年少輕狂三年度,淚對空樽,無奈留村住。...
    魯盾閱讀 892評論 0 4
  • 1.什么是變量:指代在內(nèi)存開辟的存儲空間,用來存放數(shù)據(jù)。栗子:int a = 5(a 為變量) 2.一條語句聲明多...
    Bruin_熊先森閱讀 747評論 0 0

友情鏈接更多精彩內(nèi)容