最近在複習紅寶書的物件一章,紅寶書中一共提到了7種建立物件的方式(這裡所說的物件更偏向於物件導向程式設計中的物件)。7種方式分別是:
首先解釋幾個概念:
物件 下面例子中所有的person函式1例項/物件例項 通過
new person()
orperson()
返回的物件,如var person1 = new person()
中的person1原型物件
person.prototype
2
3
4
5
6
7
8
9
10
function person()
return o;
}var person1 = person();
優點:完成了返回乙個物件的要求。
缺點:
無法通過constructor識別物件,以為都是來自object,無法得知來自person
每次通過person建立物件的時候,所有的say方法都是一樣的,但是卻儲存了多次,浪費資源。
1
2
3
4
5
6
7
8
function person()
}
var person1 = new person();
優點:
通過constructor或者instanceof可以識別物件例項的類別
可以通過new 關鍵字來建立物件例項,更像oo語言中建立物件例項
缺點:
多個例項的say方法都是實現一樣的效果,但是卻儲存了很多次(兩個物件例項的say方法是不同的,因為存放的位址不同)
注意:
建構函式模式隱試的在最後返回return this
所以在缺少new的情況下,會將屬性和方法新增給全域性物件,瀏覽器端就會新增給window物件。
1
2
3
4
5
6
7
8
function person() {}
person.prototype.name =
'hanmeimei';
person.prototype.say =
function()
person.prototype.friends = [
'lilei'];
var person1 = new person();
優點:
say方法是共享的了,所有的例項的say方法都指向同乙個。
可以動態的新增原型物件的方法和屬性,並直接反映在物件例項上。
1
2
3
4
5
var person1 = new person()
person.prototype.showfriends =
function()
person1.showfriends()
//['lilei']
缺點:
出現引用的情況下會出現問題具體見下面**:
1
2
3
4
var person1 = new person();
var person2 = new person();
person1.friends.push(
'xiaoming');
console.log(person2.friends) //['lilei', 'xiaoming']
因為js對引用型別的賦值都是將位址儲存在變數中,所以person1和person2的friends屬性指向的是同一塊儲存區域。
第一次呼叫say方法或者name屬性的時候會搜尋兩次,第一次是在例項上尋找say方法,沒有找到就去原型物件(person.prototype)上找say方法,找到後就會在實力上新增這些方法or屬性。
所有的方法都是共享的,沒有辦法建立例項自己的屬性和方法,也沒有辦法像建構函式那樣傳遞引數。
注意:
優點②中存在乙個問題就是直接通過物件字面量給person.prototype
進行賦值的時候會導致constructor
改變,所以需要手動設定,其次就是通過物件字面量給person.prototype
進行賦值,會無法作用在之前建立的物件例項上
1
2
3
4
5
6
7
8
9
var person1 = new person()
person.prototype =
}
person1.setname()
//uncaught typeerror: person1.set is not a function(…)
這是因為物件例項和物件原型直接是通過乙個指標鏈結的,這個指標是乙個內部屬性[[prototype]],可以通過__proto__
訪問。我們通過物件字面量修改了person.prototype指向的位址,然而物件例項的__proto__
,並沒有跟著一起更新,所以這就導致,例項還訪問著原來的person.prototype
,所以建議不要通過這種方式去改變person.prototype
屬性
1
2
3
4
5
6
7
8
9
10
function person(name)
person.prototype.say =
function()
var person1 = new person('hanmeimei')
person1.say()
//hanmeimei
優點:
解決了原型模式對於引用物件的缺點
解決了原型模式沒有辦法傳遞引數的缺點
解決了建構函式模式不能共享方法的缺點
缺點:
和原型模式中注意①一樣
1
2
3
4
5
6
7
function person(name)
}
優點:
可以在初次呼叫建構函式的時候就完成原型物件的修改
修改能體現在所有的例項中
缺點:紅寶書都說這個方案完美了。。。。
注意:
只用檢查乙個在執行後應該存在的方法或者屬性就行了
不能用物件字面量修改原型物件
1
2
3
4
5
6
7
8
9
10
function person(name)
return o
}var peron1 = new person('hanmeimei')
優點:
和工廠模式基本一樣,除了多了個new操作符
缺點:
和工廠模式一樣,不能區分例項的類別
1
2
3
4
5
6
7
8
9
10
function person(name)
}
var person1 = new person('hanmeimei');
person1.name
// undefined
person1.say()
//hanmeimei
優點:
安全,那麼好像成為了私有變數,只能通過say方法去訪問
缺點:
不能區分例項的類別
建立團隊讀書筆記
在研究怎麼讓團隊高效,優質的完成工作之前,我們首先要看一下什麼是團隊,儘管這個概念有的時候並不那麼確切,總的來說,團隊是由若干人組成的相互依賴的組織,這些人共同負責為本組織提供一定的成果。就比如你所在的專案組,或者是研發中心,總是要提供一定的成果,如果整天什麼也不幹,那不叫團隊。構成團隊的人,在資訊...
物件導向讀書筆記
靜態類和非靜態類 靜態類 靜態屬性等 是類所有的,非靜態類為類的例項所有的。靜態類是類的所有例項所共享的,無論此類建立了多少例項,靜態類在記憶體中都只開闢了一塊儲存空間。const常量也可以看成這種型別 public class myclass 呼叫時可以直接myclass.kiss my clas...
讀書筆記 物件導向
看了譚云傑老師的 thinking in uml 一書,前面講解了物件導向的內容,特此編寫一下讀書筆記。封裝 繼承 多型 構造乙個更大更複雜的系統 復用 可拓展性增強 利於分工協作 更能專注某個功能點研究,需要考慮的資訊量大大減少。現實世界如何對映到乙個物件世界?物件世界如何描述現實世界?如何驗證物...