| 文章簡介:使用動態原型模式時,不能使用對象字面量重寫原型。前面已經解釋過了,如果在已經建立了執行個體的情況系重寫原型,那麼就會切斷現有執行個體與新原型之間的聯絡。 |
有其它OO語言經驗的開發人員在看到獨立的建構函式和原型時,很可能會感到非常的困惑。動態原型模式正是致力於解決這個問題的一個方案,它把所有資訊都封裝在了建構函式中,而通過在建構函式中初始化原型(僅在必要的情況下),又保持了同時使用建構函式和原型的優點。換句話說,可以通過檢查某個應該存在的方法是否有效,來決定是否需要初始化原型。來看一個例子:
function Person(name, age, job) { //屬性 this.name = name; this.age = age; this.job = job; //方法 if (typeof this.sayName != "function") { Person.prototype.sayName = function () { alert(this.name); }; }}var person = new Person("Nicholas", 29, "Software Engineer");person.sayName(); //"Nicholas"
這裡只在sayName()方法不存在的情況下,才會將它添加到原型中。這段代碼只會在初次調用建構函式時才會執行。此後,原型已經完成初始化,不需要再做什麼修改了。不過要記住,這裡對原型所做的修改,能夠立即在所有執行個體中的得到反映。因此,這種方法確實可以說非常完美。其中,If語句檢查的可以是初始化之後應該存在的任何屬性或方法——不必用一大堆if語句檢查每個屬性和方法;只要檢查其中一個即可。對於採用這種模式建立的對象,還可以使用instanceof操作符確定它的類型。
使用動態原型模式時,不能使用對象字面量重寫原型。前面已經解釋過了,如果在已經建立了執行個體的情況系重寫原型,那麼就會切斷現有執行個體與新原型之間的聯絡。