/*一、工厂模式*/
/*工厂模式解决了创建相似对象的问题,但却没有解决对象识别的问题(怎样知道一个对象的类型)*/
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("Dzz",24,"Web Engineer");
/*二、构造函数模式*/
/*构造函数模式
* 要创建一个新实例,必须使用new操作符。以这种方式调用构造函数实际上会经历一下四个步骤
* 1、创建一个新的对象
* 2、将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
* 3、执行构造函数中的代码(为这个新对象添加属性)
* 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("Dzz",24,"Web Engineer");
/*三、原型模式模式*/
/*原型模式
* 使用原型对象的好处是可以让所有的对象实例共享它所包含的属性和方法
* */
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
/*四、组合使用构造函数模式和原型模式*/
/*组合使用构造函数模式和原型模式
*这个例子中实例属性都是在构造函数中定义的,而由所有实例共享的属性constructor和方法sayName()则是在原型中定义的。而
* 修改了person1.friends(向其中添加一个新的字符串),并不会影响到person2.friends因为它们分别引用了不同的数组.这种
* 构造函数与原型混成的模式,是目前在ECMAscript中使用最广泛、认同度最高的一种创建自定义类型的方法*/
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby","Court"];
}
/*Person.prototype为Person的原型对象 */
Person.prototype = {
constructor: Person,
sayName : function (){
alert(this.name);
}
}
var person1 = new Person("Nicholas",24,"Software");
var person2 = new Person("DZZ",24,"Web");
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
/*五、动态原型模式*/
/*动态原型模式
* 这里只在sayName()方法不存在的情况下,才会将它添加到原型中。这段代码只会在初次调用构造函数时才会执行。
* 此后,原型已经完成初始化,不需要再做什么修改了。这里对原型的修改,能够立即在所有实例中得到反应。
* 使用动态原型模式时,不能使用对象字面量重写原型。如果在已经创建了实例的情况下重写原型,那么就会切
* 断现有实例与新原型之间的关系*/
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);
}
}
}
var friend = new Person("Nichloas",28,"Software Engineer");
friend.sayName();
/*六、寄生构造函数*/
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 friends = new Person("Nicholas",29,"Software Engineer");
friends.sayName();//Nicholas
/*七、稳妥构造函数*/
function Person(name,age,job){
//创建要返回的对象
var o = new Object();
//可以在这里定义私有变量和函数
//添加方法
o.sayName = function () {
alert(name);
};
//返回对象
return o;
}
var friend = Person("Nicholas",29,"Software Engineer");
friend.sayName();//Nicholas