//创建对象
// 1.工厂模式
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("Nike",29,"doctor");
var person2 = createPerson("bob",22,"student");
// 2.构造函数模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
}
}
// 构造函数的问题就是每个方法都要在每个实例上重新创建一遍。
// 导致不同的作用域链和标示符解析
// 然而创建两个相同任务的function确实没有必要;有this在,不用在执行代码前就把 函数绑定到某个特定的对象上
// 可以把函数转移到构造函数外部
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=sayName;
}
function sayName(){
alert(this.name);
}
// 3.原型模式
// 我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有
// 实例共享的属性和方法。如果按照字面意思来解释,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象
// 的好处就是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义实例的信息,而是将这些信息直接添加到原型
// 对象中,如下面的例子所示:
function Person(){
}
Person.prototype.name="Nike";
Person.prototype.age="29";
Person.prototype.job="Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
// 4.组合使用构造函数模式和原型模式
// 创建自定义属性最常见的方式就是组合使用构造函数模式和原型模式。构造函数模式用来定义实例属性,而原型模式用于定义方法和共享的属性。
// 每个实例都会有一份实例属性的副本,但同时又共享着对方的方法引用,最大限度的节省了内存。另外,这种模式支持向构造函数传递参数;可谓
// 集两种模式之长。
function Person(){
this.name = "Nike";
this.age = 32;
this.job = "Software Engineer";
this.friends = ["Shelby","Court"];
}
Person.prototype = {
constructor : Person,
sayName : function (){
alert(this.name);
}
}
var person1 = new Person("Nike",32,"teacher");
var person2 = new Person("Bob",23,"Doctor");
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
// 在这个例子中,实例属性都是在构造函数中定义的,而由所有实例共享的属性constructor和方法sayName() 则是在原型中定义的。
// 而修改了 person1.friends(向其中添加一个新字符串),不会影响到person2.friends,因为他们分别引用了不同的数组。
//
// 5.动态原型模式
function Person("Nike",23,"Doctor"){
this.name = name;
this.age = age;
this.job = job;
if( typeof this.sayName != "function" ){
Person.prototype.sayName = function (){
alert(this.name);
};
};
}
// 6.寄生构造函数模式,基本思想是创建一个函数,作用仅仅是封装创建对象的代码,然后返回创建的对象
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;
}
阅读(173) | 评论(0) | 转发(0) |