通常我們創(chuàng)建一個自定義對象可以使用以下兩種方法
- 使用對象字面量
var obj = {name: 'nany', sex: 'female', run: function(){ /* do something */ }}
- 使用構(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ù)代碼的問題,機(jī)智的程序員提出了一種設(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幫我們做了如下的事情:
- 不用顯示的創(chuàng)建對象,因為 new 會幫你做(使用「this」就可以訪問到臨時對象)搁骑;
- 直接將屬性和方法賦給了this對象
- 不用 return 對象斧吐,因為 new 會幫你做又固;
這個模式被稱為構(gòu)造函數(shù)模式,按照慣例煤率,構(gòu)造函數(shù)始終都應(yīng)該以一個大寫字母開頭仰冠,并且使用new操作符來創(chuàng)建構(gòu)造函數(shù)的實(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 總共幫我們做了如下的事情:
- 不用顯示的創(chuàng)建對象郊闯,因為 new 會幫你做(使用「this」就可以訪問到臨時對象)妻献;
- 直接將屬性和方法賦給了this對象;
- 不用 return 對象团赁,因為 new 會幫你做育拨;
- 不用綁定原型,new指定原型的名字為 prototype欢摄;