JS建立對象的幾種方式
(一)工廠模式
所謂的工廠方式就是構造一個普通的函數,在函數裏面構建一個包含全部信息的對象而且返回,而後在建立對象的時候使用該函數而且傳入相對應的參數便可
示例代碼:
function createObject(name ,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayname = function(){
alert(this.name);
};
return o;
}
var person1 = createObject('sunshine',24,'engineer');
var person2 = createObject('yuanfang',21,'student');
console.log(person1);
console.log(person2);
(二)構造函數模式
這種模式相對於有過c++基礎的童鞋來講是很是簡單易懂的,而且經過new來進行建立,調用這種方式建立的時候會經歷下面四個步驟:
(1)建立一個新對象
(2)將構造函數的做用域賦給新對象,也就是this指針的指向
(3)執行構造函數中的代碼
(4)返回新對象
這個new關鍵字是必須,若是不加,clock就不會當成構造函數調用,而只是一個普通的函數
示例代碼:
function CreateObject(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayname = function(){
alert(this.name);
};
}
var person1 = new CreateObject("yuangang",23,'engineer');
var person2 = new CreateObject('sunshine',45,'student');
alert(person1.constructor == person2.constructor);
(三)原型模式
每個函數都有一個prototype屬性,這個屬性是一個指向一個對象的指針,它可讓全部對象共享它所包含的屬性和方法,每個構造函數都有一個原型對象,原型對象在默認的時候有一個屬性constructor,指向構造函數,而每個對象都有一個指向原型對象的內部指針
示例代碼:
function Person(){}
Person.prototype.name = "sunshine";
Person.prototype.age = '23';
Person.prototype.job = 'engineer';
Person.prototype.sayname = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayname();
var person2 = new Person();
person2.sayname();
alert(person1.sayname == person2.sayname);
(四)組合使用構造函數模式和原型模式
說白了就是實例屬性都在構造函數中定義,而由全部實例共享的屬性constructor和方法都在原型中定義。
示例代碼:
function Person(name ,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ['shelby','court'];
}
Person.prototype = {
constructor : Person,
sayname:function(){
alert(this.name);
}
}
var person1 = new Person('yuanfang',23,'student');
var person2 = new Person('sunshine',34,'engineer');
person1.friends.push('sunshine');
alert(person1.friends);
alert(person2.friends);
alert(person1.friends === person2.friends);
(五)動態原型模式
是原型模式的一種特例:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if(typeof(this.sayname) != 'function'){
Person.prototype.sayname = function(){
alert(this.name);
};
}
}
(六)寄生構造函數模式
除了使用new操做符並把使用的包裝函數叫作構造函數以外,這個魔術和工廠模式沒有什麼區別
function Person(name ,age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayname = function(){
alert(this.name);
};
return o;
}
var person1 = new Person('yuanfang',23,'student');
person1.sayname();
(七)穩妥構造函數模式
這個就和c++中的在構造函數中建立一個函數來訪問類中的私有變量的功能是同樣同樣的,這裏不貼代碼實例了
感受好高深啊,藉此只是但願本身可以透徹理解吧,fighting
c++