讀書筆記之建立物件

2021-09-07 07:28:53 字數 4705 閱讀 1257

最近在複習紅寶書的物件一章,紅寶書中一共提到了7種建立物件的方式(這裡所說的物件更偏向於物件導向程式設計中的物件)。7種方式分別是:

首先解釋幾個概念:

物件 下面例子中所有的person函式

例項/物件例項 通過new person()orperson()返回的物件,如var person1 = new person()中的person1

原型物件person.prototype

1

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 一書,前面講解了物件導向的內容,特此編寫一下讀書筆記。封裝 繼承 多型 構造乙個更大更複雜的系統 復用 可拓展性增強 利於分工協作 更能專注某個功能點研究,需要考慮的資訊量大大減少。現實世界如何對映到乙個物件世界?物件世界如何描述現實世界?如何驗證物...