在上篇文章中JavaScript中的對象和原型(一)提到了JavaScript中對象的創建的一些基本操作,接下來討論下繼續討論。
一 工廠模式
我們知道,要創建一個對象我們可以用如下代碼:
var user = new Object(); //使用new運算符創建一個對象 user.name = '念在三角湖畔'; //給對象添加屬性 user.age = 22; user.address = '湖北武漢'; alert(user.name + " " +user.age);//返回 '念在三角湖畔 湖北武漢'
用這樣的方法創建對象比較簡單直觀,也是JavaScript種創建對象最基本的方法。但是這樣就有一個問題,如果我們需要創建多個對象,那麼我就得寫很多重復的代碼。比如我們想創建另一個對象user1,我們就得重新將上面的代碼重新寫一遍,這在實際開發過程中是不合適的,這樣如果對象過多,代碼量將大大增加。
為了解決這樣的問題,我們可以使用一種叫做工廠模式的方法,這種方法 就是為了解決實例化對象產生大量重復代碼的問題。
function create(name, age) { var obj = new Object(); obj.name = name; obj.age = age; obj.run = function () { return this.name +' '+ this.age; }; return obj; } var obj1= create('ZXC', 10); //第一個實例 var obj2= create('CXZ', 20); //第二個實例 alert(obj1.run()); alert(obj1.run());
從上面的代碼我們可以看出,工廠模式解決了實例化時代碼大量重復的問題,但又出現了一個問題,那就是識別問題,我們根本無法弄清楚他們到底是哪個對象的實例。比如
alert(typeof obj1); //Object alert(obj1 instanceof Object); //true
以上代碼標明box1是Object對象,但是我們無法知道具體是哪一個對象創建的。
二 構造函數(構造方法)
為了解決上面的問題,我們可以用構造方法去創建對象。構造函數和普通函數的唯一區別,就是調用的方式不同。但是,構造函數同樣是函 數。
function User(name, age) { //構造函數模式 this.name = name; this.age = age; this.run = function () { return this.name + ' '+this.age; }; }
創建對象的時候用new運算符就可以了:
var user1= new User('ZXC', 25); var user2= new User('CXZ', 22);
現在我們就可以檢測user1或者user2是不是屬於User。
alert(user1 instanceof User);//true
可見,使用構造函數的方法,即解決了重復實例化的問題,又解決了對象識別的問題。
使用構造函數時執行的過程如下:
1.執行 new 構造函數()時,後台執行了 new Object();
2.將構造函數的作用域給新對象。
3.執行構造函數內的代碼;
4.後台直接返回新對象。
接下來我們看看構造函數內部的函數問題。如果我們執行以下語句:
alert(user1.run==user2.run);//結果返回的是false
結果返回的是false,這就說明方法其實也是一種引用地址。如果我們同樣重復創建了多個對象,那麼每個對象中的方法都會在內存中開辟新的空間,這樣浪費的空間就比較多。要解決這個問題,我們就需要用到實例屬性或者方法的共享,下一篇文章中將繼續探討解決這個問題。
以上所述是小編給大家介紹的Javascript中的對象和原型(二),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對網站的支持!