js創建對象
- 工廠模式
function Person(name, age){
var o = new Object();
o.name = name;
o.age = age;
o.sayName = function(){
console.log(this.name);
};
return o;
};
var p = new Person('viven', 28);
console.log(p.constructor == Person); // false
工廠模式最大的問題就是不能識別對象,可以用構造函數解決。
- 構造函數
構造函數的創建會經歷一下幾個步驟
(1) 創建一個新對象;
(2) 將構造函數的作用域賦給新對象(因此 this 就指向了這個新對象);
(3) 執行構造函數中的代碼(爲這個新對象添加屬性);
(4) 返回新對象
function Person(name, age){
this.name = name;
this.age = age;
this.sayName = function() {
console.log(this.name);
};
};
var p = new Person('viven', 28);
console.log(p.constructor == Person); // true
var p1 = new Person('kevin', 30);
console.log(p.sayName == p1.sayName); // false 不是同一個函數。
構造函數解決了工廠函數的對象不能識別的問題,但是出現的新問題就是每次新建一個實例就會新建一個sayName函數,如果有很多,就會創建很多相同的函數。
以上,兩個實例的sayName函數不是同一個,造成了資源的浪費,這就引出了原型模式。
- 原型模式
function Person(){};
Person.prototype = {
name: 'viven',
age: 28,
sayName: function() {
console.log(this.name);
}
}
var p = new Person();
var p1 = new Person();
console.log(p.sayName == p1.sayName) // true 是同一個函數
console.log(p.constructor == Person) // false
// 因爲直接用對象的方式創建原型,會改寫原型,那麼constructor指向就會切斷原聯繫,一般會這樣做
Person.prototype = {
constructor: Person,
name: 'viven',
age: 28,
sayName: function() {
console.log(this.name);
}
}
console.log(p.constructor == Person) // true
這樣就能解決重複創建函數的問題,當然這樣就不能傳遞參數進去,進行個性化的設置,那麼我們可以使用構造函數和原型模式的組合來解決這個問題。
- 構造函數和原型模式的組合用法
這樣既可以個性化設置自己的屬性,同時可以節約內存,創建一個公用函數。
function Person(name, age){
this.name = name;
this.age = age;
};
Person.prototype = {
constructor: Person,
sayName: function() {
console.log(this.name);
}
}
var p = new Person('viven', 30);
var p1 = new Person('kevin', 28);
console.log(p.sayName == p1.sayName) // true
以上就是js創建對象的小知識,當然最主要的瞭解構造函數和原型的內容。