---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
创建自定义对象的最简单方式就是创建一个Object的实例,然后再为它添加属性和方法
var person =new Object();
person.name="IrvingLin";
person.age=26;
person.job="Student";
person.sayName=function(){
alert(this.name);
};
person.sayName();
这种方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。为了解决这个问题,人们开始使用工厂模式的一种变体
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("IrvingLIn",26,"Student");
var person2=createPerson("林其响",26,"学生");
person1.sayName();
person2.sayName();
工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。于是出现了构造函数模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
};
}
var person1=Person("IrvingLIn",26,"Student");
var person2=Person("林其响",26,"学生");
person1.sayName();
person2.sayName();
在这个列子中,Person()函数取代了createPerson()函数。存在以下区别:
没有显式的创建对象;直接将属性和方法赋给了this对象;没有return语句。
此外函数名Person使用的是大写字母P。按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数应该以一个小写字母开头。
要创建Person的新实例,必须使用new操作符。以这种方式调用构造函数实际会经历一下四个步骤: (1)穿件一个新对象(2)将构造函数的作用域赋给新对象(因此this就指向了这个新对象)(3)执行构造函数中的代码(为这个新对象添加属性)(4)执行新对象
原型模式
使用原型的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象信息,而是可以将这些信息直接添加到原型对象中
function Person(){
}
Person.prototype.name="IrvingLin":
Person.prototype.age=26;
Person.prototype.job="Student";
Person.prototype.sayName=function(){
alert(this.name);
};
var person1=new Person();
person1.sayName();
var person2=new Person();
person2.sayName();
alert(person1.sayName==person2.sayName); //true
我们将sayName()方法和所有属性直接添加到了Person的prototype属性中,构造函数变成了空函数。即使如此。也仍然可以通过调用
构造函数来创建一个新对象,而且新对象还会具有相同的属性和方法。但与构造函数模式不同的是,新对象的这些属性和方法是由所有
实例共享的。person1和person2访问的都是同一组属性和同一个sayName()函数。
如图展示了Person构造函数、Person的原形属性以及Person现有的两个实例之间的关系。
组合使用构造函数模式和原形模式
创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。结构每个实例都会有自己的一份实例属性的副本,但同时又共享着对方方法的引用,最大限度的节省了内存。另外,这种混成模式还支持向构造函数传递参数;可谓是集两种模式之长。
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("IrvingLin",26,"Student");
var person2=new Person("林其响",26,"学生");
person1.friends.push("Van");
alert(person1.friends);
alert(person2.friends);
alert(person1.friends==person2.friends); //false
alert(person1.sayName==person2.sayName);//true
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------