js 設計模式與繼承學習

2022-08-27 03:12:07 字數 1633 閱讀 4994

建立自定義物件的最簡單方式是new 乙個object物件,然後給它新增方法與屬性

如:

1

var 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...