1. 構造函數(shù)模式
function Foo(arg) {
this.xxx = arg;
this.xxx = xxx;
}
構造函數(shù)模式的函數(shù)體在每次new對象的時候都會執(zhí)行一遍. new的話, 會自身創(chuàng)建一個作用域, 里面的this指向這個, 若是沒有new, 直接執(zhí)行, 那this得根據(jù)具體執(zhí)行上下文確定. 這種方法會導致方法具有多個實例, 浪費內(nèi)存.
2. 原型模式
function Foo() {
}
Foo.prototype = {
xxx: xxx,
xxx: xxx
}
原型模式相對于構造模式來說是沒有構造參數(shù)的. 而且這種方法不具有實例私有的屬性.
3. 構造函數(shù)模式和原型模式兩者適用范圍與組合使用
最好兩者結合適用, 構造函數(shù)模式負責創(chuàng)建實例屬性, 原型模式負責創(chuàng)建方法和共享的屬性, 這樣能最大限度節(jié)省內(nèi)存.
4. 寄生構造函數(shù)模式
這種方法說白了就是在構造函數(shù)模式上寄生了原型模式, 通過判斷是否已存在某個原型屬性, 來判斷是否需要執(zhí)行原型初始化.
function Person(name) {
this.name = name;
if(typeof this.sayName != 'function') {
Person.prototype.sayName = function () {
alert(this.name);
}
}
}