編程思想:
? ? 面向過程? 按照步驟解決問題,自頂向下 逐步細化
? ? ? ? ? ? ? ? ? ? 將函數(shù)封裝為一個功能模塊歇由,逐步執(zhí)行果港,來實現(xiàn)代碼的重用與模塊化編程
? ? 面向對象 模擬現(xiàn)實世界,抽象出實體谢谦,有哪些屬性和方法 通過實體來實現(xiàn)操作與業(yè)務邏輯
? ? ? ? ? ? ? ? ? ? OOP = 對象 + 類 + 繼承 + 多態(tài) + 消息
? ? ? ? ? ? ? ? ? ? 優(yōu)點:1 數(shù)據(jù)抽象 → 保持外部接口不變的情況下改變內部實現(xiàn)萝衩,減少對外部的干擾? ? 2 繼承 → 減少冗余代碼,方便擴展猩谊,降低維護成本? 3 封裝 → 隱藏了具體的實現(xiàn),如果實現(xiàn)的改變或升級對于使用方而言是無感知的墙牌,提高程序的可維護性暗甥;而且封裝鼓勵程序員把特定數(shù)據(jù)與對數(shù)據(jù)操作的功能打包在一起,有利于應用程序的去耦
? ? ? ? 需要注意的是這里類的行為意味著復制:實例化的過程是將類的行為復制到實例化對象中撤防,類的繼承也是將類的行為復制到子類中。
????????類理論:行為抽象到父類辜膝,子類進行特殊化(重寫)→ 多態(tài) 操作實例(擁有所有的行為)
JavaScript中的 混合對象“類”
1 混入 mixin(...) → 模仿類的復制行為
問題 1)不是真正的復制,對象類型還是引用的復制合敦,實際上還是共享的狀態(tài)
? ? ? ? 2)顯式多態(tài) → 調用引用名稱標識符重疊的函數(shù) 帶this指向時 要使用call等方法調用固定this
2 通過 ?[[Prototype]] 模擬繼承行為
? ??????[[Prototype]]:JavaScript 中的對象有一個特殊的 [[Prototype]] 內置屬性验游,其實就是對于其他對象的引用。幾乎所有的對象在創(chuàng)建時 [[Prototype]] 屬性都會被賦予一個非空的值耕蝉。
? ? ? ? 原型鏈:如果在對象上沒有找到需要的屬性或者方法引用,引擎就 會繼續(xù)在 [[Prototype]] 關聯(lián)的對象上進行查找蒜魄。同理场躯,如果在后者中也沒有找到需要的 引用就會繼續(xù)查找它的 [[Prototype]],以此類推踢关。這一系列對象的鏈接被稱為“原型鏈”。
? ??????屬性設置與屏蔽規(guī)則:
1)如果在 [[Prototype]] 鏈上層存在名為 foo 的普通數(shù)據(jù)訪問屬性并且沒 有被標記為只讀(writable:false)秕脓,那就會直接在 myObject 中添加一個名為 foo 的新 屬性儒搭,它是屏蔽屬性。
2)如果在 [[Prototype]] 鏈上層存在 foo搂鲫,但是它被標記為只讀(writable:false),那么 無法修改已有屬性或者在 myObject 上創(chuàng)建屏蔽屬性怔檩。如果運行在嚴格模式下蓄诽,代碼會 拋出一個錯誤媒吗。否則,這條賦值語句會被忽略〗橥啵總之出吹,不會發(fā)生屏蔽
?3)如果在 [[Prototype]] 鏈上層存在 foo 并且它是一個 setter(參見第 3 章),那就一定會 調用這個 setter捶牢。foo 不會被添加到(或者說屏蔽于)myObject,也不會重新定義 foo 這 個 setter渐排。
原型繼承:在二個對象間創(chuàng)建一個關聯(lián)灸蟆,這樣其中一個對象可以通過委托訪問另一個對象的屬性。實現(xiàn)方式:
1)對象關聯(lián):
2 )構造函數(shù)模擬類的實現(xiàn)
拓展:JavaScript原型相關的操作
1)內士筛俊(反射)找到一個對象的委托關聯(lián):
a instanceof Foo?:在 a 的整條 [[Prototype]] 鏈中是否有指向 Foo.prototype 的對象
Foo.prototype.isPrototypeOf( a ):在 a 的整 條 [[Prototype]] 鏈中是否出現(xiàn)過 Foo.prototype
Object.getPrototypeOf( a ) === Foo.prototype;
a.__proto__ === Foo.prototype;
2)__proto__ 的實現(xiàn)