js因為沒有類的概念,所以建立物件時就會有許多的問題,下面列舉幾種建立物件的模式.
現在前面做乙個列表
一 工廠模式
二 建構函式模式
三 原型模式
四 組合使用建構函式模式和原型模式
五 動態原型模式
六 寄生構造模式
七 穩妥建構函式模式
工廠模式
用函式來封裝一特定的介面建立物件的細節
function
createperson
(name, age, job)
return o;
}var person1 = createperson("bob",29,"doctor");
person1.sayname();//bob
工廠模式不能解決物件識別的問題
建構函式模式
js中的建構函式可用來產檢特定型別的物件。像object和array這樣的原生建構函式,在執行是自動出現在執行環境中。此外,也可以建立自定義的建構函式,從而定義自定義物件型別的屬性和方法。
function
person
(name, age, job)
}var person1 = new person("bob",29,"doctor");
person1.sayname();//bob
在建構函式中person函式取代了createperson函式,在建構函式中
沒有顯示的建立物件
直接將屬性和方法賦給了this物件
沒有return語句
要建立person的新例項,必須使用new操作符,用這種方法來呼叫建構函式實際上會經歷一下4個步驟:
1.建立乙個新物件
2.將建構函式作用域賦給性新物件(因此this指向這個新物件)
3.執行建構函式中的**
4.返回新的物件
前面的person1有乙個建構函式屬性,該屬性指向person。
alert(person1.constructor == person);//true
當然也可以使用型別檢測instanceof來檢測
alert(person1 instanceof object);//true
alert(person1 instanceof person);//true
在建構函式模式中每乙個物件都有自己的乙個方法,導致重用性不高.
alert(person1.sayname == person2.sayname);//false
原型模式
我們建立的每乙個函式都有乙個prototype屬性,這個屬性是乙個物件,他的用途包含可以由特定型別的所有例項共享的屬性和方法。按照字面意思來理解,那麼prototype就是通過呼叫建構函式而穿件的那個物件的原型物件。使用原型的好處就是可以讓所有的物件例項共享他所包含的屬性和方法。
function
person
()person.prototype.name = "nicholas";
person.prototype.age = 29;
person.prototype.job = "doctor";
person.prototype.sayname = function
() var person1 = new person();
person1.sayname();//nicholas
var person2 = new person();
person2.sayname();//nicholas
alert(person1.sayname == person2.sayname);//true
無論什麼時候,只要建立了乙個函式,就會根據一組特定的規則為該函式建立乙個prototype屬性,在預設情況下,所有prototype屬性都會自動獲得乙個constructor(建構函式)屬性,這個屬性包含乙個指向prototype屬性所在函式的指標.
建立了自定義函式之後,其原型屬性預設只會取得constructor屬性;至於其他方法則是從object繼承過來的。當呼叫建構函式建立乙個例項後,該例項的內部將包含乙個指標,指向建構函式的原型屬性。注意:這個屬性存在於這個例項和建構函式原型之間而不是例項和建構函式之間.
組合使用建構函式模式和原型模式
建立自定義型別的最常見的方式就是組合使用建構函式模式與原型模式.建構函式用於定義屬性而原型模式用於定義方法.
/**
* created by lenovo on 2017/4/8.
*/function person(name, age, job)
person.prototype =
}var person1 = new person("nicholas",29,"doctor");
var person2 = new person("bob",30,"student");
alert(person1.sayname());//nicholas
alert(person2.sayname());//bob
動態原型模式
為了將原型和建構函式寫到一起,所以出現了動態原型模式
function
person
(name, age, job)
}}
寄生建構函式模式
通常在前集中模式都不適用的情況下,可以使用寄生建構函式模式.這種迷失的基本思想是建立乙個函式,該函式的作用僅僅是封裝建立物件的**,然後再返回新建立的物件;但從表面看,這個函式又很想是典型的建構函式.
function
person
(name, age, job) ;
return o;
}var person = new person("bob",29,"doctor");
person.sayname();//bob
在這個例子中,person函式建立了乙個新物件,並且以相應的屬性和方法初始化該物件,然後又返回了這個物件.除了使用new操作符並把包裝的函式叫做建構函式之外和工廠模式其實是一模一樣的.建構函式在不返回值的情況下,缺省會返回新物件.而通過在建構函式的末尾加乙個return語句,可以重寫呼叫建構函式時返回的值.
穩妥建構函式模式
道格拉斯.克羅克德福發明了js中的穩妥物件這個概念值得是沒有公共屬性,而且其方法也不引用this物件.
function
person
(name, age, job)
return o;
}var person = person("bob",29.
"doctor");
person.sayname();//bob
這樣變數person中儲存的是乙個穩妥物件,而除了呼叫sayname()方法外,沒有別的方式可以訪問到其資料成員。 js 建立js物件
js建立類有集中方法,我個人比較喜歡的方式是 混合的建構函式 原型方式 比較好理解 用建構函式來定義非函式屬性,用原型方式定義物件的函式屬性,結果所有函式鬥只建立一次,而每個物件鬥具有自由的物件屬性例項。function ocar color ocar.prototype.showcolor fun...
js建立物件陣列 JS 物件
定義 無序的資料集合 鍵值對集合 建立物件的方式 new 操作符 object 建立物件 var person new object person.name lisi person.age 21 person.family lida lier wangwu person.say function 2...
js 建立物件
js建立物件方式 var lev function function parent var x parent alert x.name alert x.lev 說明 1.在函式中定義物件,並定義物件的各種屬性,雖然屬性可以為方法,但是建議將屬性為方法的屬性定義到函式之外,這樣可以避免重複建立該方法 ...