建立自定義物件的最簡單方式是new 乙個object物件,然後給它新增方法與屬性
如:
1var person = new object();
2 person.name = "張三";3 person.sayname = function()
//簡單建立物件
這種方式有個很大的缺點:復用性太低,例項化乙個這樣的實體,就得複製上的面的**。
於是想到了用工廠模式改進它:工廠抽象了創造的具體物件過程,但ecmscript沒有類的概念,這讓人很糾結,聰明的先行者,發明了一種函式代替它。
function createpersonfactory(_name,_age)return obj;
}var p1 = createpersonfactory("張三",22);
var p2 = createpersonfactory("李四",23);
//工廠模式
這種方式雖然解決了復用的問題,但因為無法識物件(無法知道這個物件的型別,因為它統一返回object的例項物件,如果我想針對某型別進行擴充套件,就得哭了)。
需求變了,模式只能再改了。建構函式模式就這樣誕生了。
function constructfun(_name,_age)}var p1= new constructfun("stick",22);
var p2 = new constructfun("dev",23);
p1.sayname();p2.sayname();
document.write(p1.constructor == constructfun);
document.write(p2.constructor == constructfun);
//constructor是用來識別使用者型別。檢測物件型別用instanceof,檢測值型別用typeof
document.write(p1 instanceof constructfun);
document.write(p2 instanceof object);
//可以通過讓方法放到外面來避免每一次都得例項化。
function constructfun(_name,_age)
function sayname()
//建構函式模式
對比工廠與構造兩種函式:工廠顯示例項化object並返回它;建構函式它繼承object,顯示例項化當前物件,直接將屬性與方法賦於this,沒有return語句。建構函式:任何以new操作操作符呼叫,它就是建構函式。
這種方式定義的物件是在global物件中,(瀏覽器為window物件)無特殊說明:instanceof和constructor屬性終始會假設在全域性作用域中查詢建構函式。
[nothing is perfect]建構函式的問題是每個方法都得例項化一次,對於實現同一功能的方法,完全沒有必要。
為什麼每個方法都得例項化一下,這是因為emcscript中的函式是物件,兩個方法不是function同乙個例項。雖然通過利用this,關鍵字把方法放到外面去,可以避免同一方法多次例項化問題的。但是這樣一來這個方法就成了全域性函式,如此物件有很多方法,就定義很多全域性函式,與封裝性違背
這時候冒出原型模式來處理這個問題。
設計模式學習筆記1 類繼承與介面繼承比較
中文版p12原文 c 中純介面繼承接近於公有繼承純抽象類,純實現繼承或純類繼承接近於私有繼承。為何c 中純介面繼承接近於公有繼承純抽象類?首先,純介面與抽象類都並未提供實現,而對純介面的繼承和對抽象類的繼承則都是要提供實現的 為何要公有繼承?顯然,乙個介面,如果被私有繼承了,那使用者該如何來訪問此介...
js學習之繼承與列舉
js學習之繼承與列舉 首先就是明白繼承的幾種方式 1.傳統方式 原型鏈,其缺點為過多的繼承了一些不需要的東西。這個例子就是原型鏈的繼承方式。2.借用建構函式的方法。不能繼承借用建構函式的原型 每呼叫建構函式都會多用乙個函式 這個例子就是借用建構函式的方式來實現繼承,這種用法主要用於當乙個方法完全覆蓋...
js原型繼承,聖杯模式繼承
1.call 可以呼叫函式 2.call 可以修改this指向,使用call 的時候,第乙個引數是修改後的this指向,引數2,引數3 使用逗號隔開 function fun x,y var obj call 可以呼叫函式 fun.call call 可以改變這個函式的this指向 此時這個函式的t...