字面量模式
在使用JavaScript進行代碼書寫時,創建對象的方式中首先推薦的模式就是字面量方式進行創建。
const person = {
name: 'jade',
age: 5
}
存在的問題:
如果僅僅是創建單個對象,使用字面量是時間簡單方便的,但是創建很對同類型對象時,這種方式就會產生大量重複代碼。
工廠模式
工廠模式是一種被廣泛熟知的設計模式,該模式將創建對象的過程抽象成工廠函數,用函數封裝創建對象的具體細節。
function crator(name, age) {
const person = {};
person.namge = name;
person.age = age;
return person;
}
存在的問題:
工廠模式可以解決創建同類型對象的問題,但是也引入了新的問題,使用工廠函數使得創建對象的過程被隱藏,對象創建完成以後就很難知道對象的具體類型,存在對象識別的問題。
構造函數模式
JavaScript
中構造函數可用來創建特定類型的對象,Object
、Array
等是原生的構造函數,在運行執行環境時就存在,我們也可以自定義構造函數。
function Person(name, age) {
this.namge = name;
this.age = age;
this.walk = function() {
console.log(`${this.name} can walk!`);
}
}
const person = new Person('Jam', 27);
構造函數與普通函數基本沒有區別,主要是使用方式不同,構造函數主要是使用new操作符進行調用,返回同是Person
類型的對象。對象的constructor
是對象類型標識,但在進行對象類型識別時instanceof
更可靠。
存在的問題:
構造函數存在最大的問題就是方法不能共享,例如walk
方法所有的Person
類型的對象都具有,但是該方法要被每一個對象實例化一次,造成不必要的開銷和內存。
原型模式
JavaScript
函數有一個prototype
屬性,指向一個對象引用,該對象上保存了特定類型對象共享的所有的屬性和方法。
function Person(name, age) {
}
Person.prototype.namge = 'Jam';
Person.prototype.walk = function() {
console.log(`${this.name} can walk!`);
}
const person = new Person();
存在的問題:
原型模式也不是完美無缺的,其最大的問題就是由於共享性所造成的,因爲實例的__proro__
屬性與構造函數的prototype
屬性是鬆散的關係,僅是一個指針引用,因此在構造函數的prototype
修改屬性和方法會立刻反應到所有的實例上。
組合(構造函數和原型)模式
使用構造函數定義實例屬性,使用原型定義共享的屬性和方法。這種組合模式目前是定義引用類型的默認模式,其集合了構造函數模式和原型模式的優勢。
function Person(name) {
this.name = name;
}
Person.prototype.walk = function() {
console.log(`${this.name} can walk!`);
}