1. 程式人生 > 實用技巧 >你明白寄生建構函式模式了嗎

你明白寄生建構函式模式了嗎

前言

在《JavaScript高階程式設計》面向物件的程式設計中,在關於如何建立物件時,有個章節是介紹寄生建構函式模式,這個模式雖然並不是很常用,但我在第一次在書中讀到這部分時,並不是很明白書中提到的 ”Person函式建立了一個新物件,並以相應的屬性和方法初始化該物件,然後又返回了這個物件。除了使用new操作符並把使用的包裝函式叫做建構函式之外,這個模式跟工廠模式其實是一模一樣的。建構函式在不返回值的情況下,預設會返回新物件例項。而通過在建構函式的末尾新增一個return語句,可以重寫呼叫建構函式時返回的值。“ 以及 ”有一點需要說明:首先,返回的物件與建構函式或者與建構函式的原型屬性之間沒有關係;也就是說,建構函式返回的物件與在建構函式外部建立的物件沒有什麼不同。為此,不能依賴instanceof操作符來確定物件型別。由於存在上述問題,我們建議在可以使用其他模式的情況下,不要使用這種模式。“

當時對這兩段話很是困惑,如今再讀這本書,突然發現對這兩段話已經可以理解了,那麼接下來就來說一下我的理解吧。

正文

先附上書中提到的例子:

function Person (name,age,job) {
            var o = new Object();
            o.name = name;
            o.age = age;
            o.job = job;
            o.sayName = function(){
                alert(this.name);
            };
            return o;
        }
        var friend1 = new Person('lisi',29,'Software Engineer');

我們再附上工廠模式:

function person (name,age,job) {
            var o = new Object();
            o.name = name;
            o.age = age;
            o.job = job;
            o.sayName = function(){
                alert(this.name);
            };
            return o;
        }
        var friend2 = person('lisi',29,'Software Engineer')

這裡可以比較明顯的看出寄生建構函式模式與工廠模式的區別,即寄生建構函式模式使用了new去例項化一個物件即 new Person(),而工廠模式是直接呼叫函式person(),這兩者建立的例項其實都是一個Object的例項,用console.dir(friend1)和console.dir(friend2),

然後是friend2

可以發現friend1和friend2是一樣的,那麼如果寄生建構函式模式在去掉return之後再去用new例項化物件呢:

function Person (name,age,job) {
            var o = new Object();
            o.name = name;
            o.age = age;
            o.job = job;
            o.sayName = function(){
                alert(this.name);
            };
        }
        var friend1 = new Person('lisi',29,'Software Engineer');

再次用console.dir(friend1)控制檯列印friend1:

可以看出這次的friend1就已經是一個Person的例項了,這也就是說在寄生建構函式模式使用return後,會切斷例項化物件與建構函式Person的聯絡。

現在我的只是還不夠不能解釋為什麼在return返回內部例項化的物件後,在使用new操作符就修改了例項化的物件的原型,後面如果我弄懂了會繼續補充。