問了、工廠介紹,解決重碼
前面已經提到,
js中建立物件的方法。不難發現,主要的建立方法中,建立乙個物件還算簡單,假設建立多個類似的物件的話就會產生大量反覆的**。
解決:工廠模式方法(加入乙個專門建立物件的方法,傳入引數避免反覆)
function createobject(name,age);
return obj; //返回物件引用
};
問
二、引入建構函式,解決物件識別
上面方法儘管攻克了避免反覆**出現的問題。但也帶來了無法識別詳細物件的問題,方法內部使用
newo
bject
的方式,最後返回該物件引用,呼叫該方法建立的物件返回的所有都是
object
的引用。因此使用
typeof
或instanceof
操作符時都無法區分詳細物件。
解決:建構函式(改良後的工廠方法)
function box(name,age);
};
比較:細心的童鞋就該發現了,該方法與問一中的工廠模式不同之處就在於:省略了newobject()的明文執行過程;省略了
return
語句,這些都由後台自己主動執行。
而建構函式差別普通函式的地方在於其呼叫方式,必須用
new運算子或物件冒充方式呼叫。
問三、引入
prototype
屬性物件。解決物件之間的共享問題
每個物件都會有乙個
prototype
,同一時候它也是乙個物件。
使用目的是為了解決共享問題,呼叫同乙個建構函式建立的該物件會共享prototype
中的屬性和方法。
解決:使用原型模式解決共享
function box() {} //宣告乙個建構函式
box.prototype.name = 'lee'; //在原型裡加入屬性
box.prototype.age = 100;
box.prototype.run = function () ;
比較:
建構函式建立
使用原型建立
細節:在呼叫屬性或方法時,採用就近原則。先查詢例項中是否存在,否的話查詢原型。可使用isp
rototypeof
(),hasownp
rototy(),in
操作符進行相關測試。
問四、使用組合,解決共享及傳參
原型模式建立物件省略了建構函式傳參初始化的過程,這既是它的缺點又是它的長處,缺點是物件初始化的值一樣,而且假設原型屬性中包括有引用型別,則對乙個物件進行更改。其它物件的相應屬性也會跟著更改了。
解決:組合建構函式
+原型模式(解決共享和傳參的問題)
function box(name, age) ;
box.prototype =
};
細節:這樣的方式事實上就是將建構函式與原型一起使用。對要建立的物件分析,將須要共享的內容放入原型中,不須要的則放在建構函式裡。這樣也就是組合了。
優化:這樣分開式的寫法難免有些怪異。我們將這兩部分合併
動態原型模式(第一次呼叫共享方法時進行初始化原型。以後就不會初始化了)
function box(name ,age) ;}}
中結:在學習
js中,還是非常須要對正統物件導向語言的理解的,在這裡我們學習了使用建構函式以及原型來建立物件,理解了二者的概念,對於後面的
js中物件導向深入學習會非常有幫助。創造出各種不同的方法來解決的不同情況下的問題,了解按需這些人才。
JS學習筆記 OO疑問之物件建立
問 一 引入工廠,解決反覆 前面已經提到,js中建立物件的方法,不難發現,主要的建立方法中,建立乙個物件還算簡單,假設建立多個類似的物件的話就會產生大量反覆的 解決 工廠模式方法 加入乙個專門建立物件的方法,傳入引數避免反覆 function createobject name,age return...
物件導向 OO 的程式設計 建立物件
為了避免大量重複 產生,可採用以下方法建立物件 1 function createperson name,age,job 89 var person1 createperson bob 23,doctor 10var person2 createperson lily 21,student 其實就是...
JS學習筆記 OO疑問之封裝
封裝是物件導向的基礎,今天所要學習的匿名函式與閉包就是為了實現js的物件導向封裝。封裝實現 封裝變數。提高資料 系統安全性。封裝正是物件導向的基礎。即沒有名字的函式。其建立方式為 function 單獨存在的匿名函式,無法執行,可通過賦值給變數呼叫或通過表示式自我執行來實現執行。1.賦值給變數為一般...