JavaScript基礎:創建自定義類型的對象

字面量模式

在使用JavaScript進行代碼書寫時,創建對象的方式中首先推薦的模式就是字面量方式進行創建。

const person = {
	name: 'jade',
	age: 5
}

存在的問題:
如果僅僅是創建單個對象,使用字面量是時間簡單方便的,但是創建很對同類型對象時,這種方式就會產生大量重複代碼。

工廠模式

工廠模式是一種被廣泛熟知的設計模式,該模式將創建對象的過程抽象成工廠函數,用函數封裝創建對象的具體細節。

function crator(name, age) {
	const person = {};
	person.namge = name;
	person.age = age;
	return person;
}

存在的問題:
工廠模式可以解決創建同類型對象的問題,但是也引入了新的問題,使用工廠函數使得創建對象的過程被隱藏,對象創建完成以後就很難知道對象的具體類型,存在對象識別的問題。

構造函數模式

JavaScript中構造函數可用來創建特定類型的對象,ObjectArray等是原生的構造函數,在運行執行環境時就存在,我們也可以自定義構造函數。

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!`);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章