一、字面量方式 問題:創建多個對象時會造成 代碼冗餘 ,很占記憶體空間。 二、工廠模式 問題:雖然解決了對象字面量創造對象冗餘的問題,但是 存在對象識別的問題 。 三、構造函數模式 問題:解決了工廠模式的問題,但是 相同方法重覆創建 就浪費了記憶體空間。 四、原型模式 問題:共用方法,解決了構造函數的問 ...
一、字面量方式
var obj = {
name: 'mm',
age: 18,
sayName: function() {
console.log(this.name);
}
}
問題:創建多個對象時會造成代碼冗餘,很占記憶體空間。
二、工廠模式
//function createToy(name) {
// var o = new Object();
// o.name = name;
// o.say = function() {
// console.log(this.name);
// }
// return o;
//}
function createToy(name) {
return {
name: name,
say: function() {
console.log(this.name);
}
}
}
var toy1 = createToy('car');
toy1.say();
var toy2 = createToy('taxi');
toy2.say();
var toy3 = createToy('bus');
toy3.say();
console.log(toy1 instanceof Object);
console.log(toy2 instanceof Object);
console.log(toy3 instanceof Object);
問題:雖然解決了對象字面量創造對象冗餘的問題,但是存在對象識別的問題,不能反映它們之間的內在關係。
三、構造函數模式
function Toy(name) {
this.name = name;
this.say = function() {
console.log(this.name);
}
}
var toy1 = new Toy('car');
var toy2 = new Toy('car');
console.log(toy1.constructor);
console.log(toy2.constructor);
console.log(toy1.say === toy2.say); // false
問題:解決了工廠模式的問題,但是相同方法重覆創建就浪費了記憶體空間。
四、原型模式
function Person() {};
Person.prototype = {
constructor: Person,
name: 'mm',
friends: ['mike','helen'],
say: function() {
console.log(this.name);
}
}
var toy1 = new Person('train');
var toy2 = new Person('bus');
toy1.friends.push('suhai');
console.log(toy1.friends);
console.log(toy2.friends);
問題:共用方法,解決了構造函數的問題。但是當前實例的引用類型的屬性被所有實例共用,一個變所有變。
五、組合模式(構造函數+原型模式)
function Person(name) {
this.name = name;
this.friends = ['mike','helen'];
};
Person.prototype = {
constructor: Person,
say: function() {
console.log(this.name);
}
}
var toy1 = new Person('train');
var toy2 = new Person('bus');
toy1.friends.push('suhai');
console.log(toy1.friends);
console.log(toy2.friends);
這是常用的創建方式。
通過構造函數模式定義實例屬性,通過原型模式定義方法和共用的屬性。