1. 先複習一下Javascript中創建對象的幾種方式
1)使用Object構造函數
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function(){
alert(this.name);
}
2) 使用對象字面量
var person = {
name : "Nicholas",
age : 29;
job : "Software Engineer";
sayName : function(){
alert(this.name);
}
};
3)工廠模式
function createPerson(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 = createPerson('Nicholas',29,'Software Engineer');
var person2 = createPerson('greg',27,'dortor');
4)構造函數模式:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
}
}
var person1 = new Person('Nicholas',29,'Software Engineer');
var person2 = new Person('greg',27,'dortor');
5)原型模式
function Person(){
Person.prototype.name="Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
}
}
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true
5.1)更加簡單的原型模式
爲了減少不必要的輸入,也爲了從視覺上更好地封裝原型的功能,用一個包含所有屬性和方法的對象字面量來重寫整個原型對象。[缺點]以這種方式重設constructor屬性會導致它的[[Enumerable]]特性被設置爲true,默認情況下原生的constructor屬性是不可枚舉的。
function Person(){};
Person.prototype = {
constructor: Person,
name : 'Nicholas',
age : 29,
job : 'Software Engineer',
sayName : function(){
alert(this.name);
}
};
6)組合模式
組合使用構造函數模式和原型模式是創建自定義類型的最常見方式。構造函數模式用於定義實例屬性,而原型模式用於定義方法和共享的屬性。這種混成模式還支持向構造函數傳遞參數,是用來定義引用類型的一種默認模式
unction 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('Nicholas',29,'Software Engineer');
var person2 = new Person('greg',27,'dortor');
person1.friends.push("van");
alert(person1.friends); // ["Shelby","Court","Van"];
alert(person2.friends) ;// ["shelby","Court"]
alert(person1.friends == person2.friends); //false
alert(person1.sayName == person2.sayName); //true
2. Node.js中的單例模式實現
單例類對象的創建使用的是上面第6種方式:組合模式
創建single_class.js,實現單例類,代碼如下:
/* single_class.js */
var _instance = null ;//定義初始化_instance
module.exports = function(time){ //定義單例類
function Class(time){
this.name = "danhuang";
this.book = 'Node.js';
this.time = time;
}
Class.prototype = {
constructor : Class,
show : function(){
console.log(this.book + ' is write by ' + this.name + ', time is ' + this.time);
}
}
this.getInstance = function(){
if (_instance === null){
_instance = new Class(time);
}
return _instance;
}
}
【代碼說明】:
var _instance = null : 存儲Class對象
function Class(time)和Class.prototype : 創建Class類和方法
this.getInstance = function(){} : 獲取單例對象接口。
注意,_instance變量要放在單例方法之外,否則將無法實現單例模式。原因是當調用單例方法時每次都會重新將其賦值爲null,而放在單例函數之外時,調用單例函數不會影響到_instancce變量的值。
接下來創建調用驗證single_class.js。代碼如下:
/*single_app.js*/
var Single = require('./single_class');
var singleObj1 = new Single('2012-11-10');
var singleClass1 = singleObj1.getInstance();
singleClass1.show();
var singleObj2 = new Single('2012-11-20');
var singleClass2 = singleObj2.getInstance();
singleClass2.show();
【代碼說明】
var Single = require('./single_class'); 獲取單例類
var singleObj1 = new Single('2012-11-10'); // new 一個新的單例類對象,並設置時間
var singleClass1 = singleObj1.getInstance(); //獲取Class類的對象
singleClass1.show():// 調用Class類對象的方法
【運行結果】
Node.js is write by danhuang, time is 2012-11-10
Node.js is write by danhuang, time is 2012-11-10
可以看到,SingleObj1和SingleObj2是一樣的,只是在new對象的時候傳遞的時間不同。這個時間主要用來判斷是否new了新的對象。