日期:2014-05-16 浏览次数:20490 次
/******************************************************************************************
* 1、最简单的方式
* 缺点:如果创建类似的对象,会出现大量的重复代码
*/
var person1 = new Object();
person1.nickname = 'maitian';
person1.age = 27;
person1.address = 'bj';
person1.getNickName = function() {
return this.nickname
};
printPerson('1、最简单的方式', person1);
1、最简单的方式 nickname: maitian, age: 27, address: bj
/*****************************************************************************************
* 2、工厂模式
* 优点:针对1存在的问题,解决代码重复
* 缺点:
* a、未解决对象识别问题,即该对象是什么类型
* b、每次创建对象,getNickName函数都会运行一次
* @param {String} nickname
* @param {number} age
* @param {String} address
* @return {Object}
*/
function createObject(nickname, age, address) {
var person = new Object();
person.nickname = nickname;
person.age = age;
person.address = address;
person.getNickName = function() {
return this.nickname
};
return person;
}
var person2 = createObject('maitian', 27, 'sz');
printPerson('2、工厂模式', person2);
2、工厂模式 nickname: maitian, age: 27, address: sz
/******************************************************************************************
* 3、构造函数模式
* 优点:解决第2中的缺点b提到的对象识别问题
* 缺点:
* a、如同2中的缺点b,每次创建对象,getNickName函数都会运行一次
* b、如果创建对象的时候忘记了new,直接写成了var person = Person3('nickname',24,'address'),
* person则为undefined
* @param {String} nickname
* @param {number} age
* @param {String} address
*/
function Person3(nickname, age, address) {
this.nickname = nickname;
this.age = age;
this.address = address;
this.getNickName = function() {
return this.nickname;
}
};
var person3 = new Person3('maitian', 27, 'zz');
printPerson('3、构造函数模式', person3);
printMessage(" person3 instanceof Person3: " + (person3 instanceof Person3));
// 这里person3为undefined
person3 = Person3('maitian',24,'zz');
/**
* 3.1、对构造函数模式的改进之一
* 优点:解决了3中缺点a存在的每次创建对象都创建一个getNickName函数问题
* 缺点:
* a、创建一个全局函数,别的地方几乎不会用到的
* b、依然存在3中缺点b
* @param {String} nickname
* @param {number} age
* @param {String} address
*/
function Person31(nickname, age, address) {
this.nickname = nickname;
this.age = age;
this.address = address;
this.getNickName = getNickName;
};
var getNickName = function(){
return this.nickname;
};
var person31 = new Person31('maitian', 27, 'zz');
printPerson('\t3.1、对构造函数模式的改进之一', person31);
printMessage("\t person31 instanceof Person31: " + (person31 instanceof Person31));
//《JavaScript高级程序设计》第二版第18.1.1节中给出的解决方法
/**
* 3.2、对构造函数模式的改进之二
* 优点:解决了3中缺点b
* 缺点:如3中缺点a
* @param {} nickname
* @param {} age
* @param {} address
* @return {}
*/
function Person32(nickname, age, address) {
if (this instanceof Person32) {
this.nickname = nickname;
this.age = age;
this.address = address;
this.getNickName = function() {
return this.nickname;
}
} else {
return new Person32(nickname, age, address);
}
};
var person32 = new Person32('maitian', 27, 'zz');
printPerson('\t3.2、对构造函数模式的改进之二', person32);
printMessage("\t person32 instanceof Person32: " + (person32 instanceof Person32));
3、构造函数模式 nickname: maitian, age: 27, address: zz person3 instanceof Person3: true 3.1、对构造函数模式的改进之一 nickname: maitian, age: 27, address: zz person31 instanceof Person31: true 3.2、对构造函数模式的改进之二 nickname: maitian, age: 27, address: zz person32 instanceof Person32: true