对象可以理解为一个名值对,其中的值可以是数据和函数。有多种方法可以创建对象,最简单的就是创建一个Object实例,再为其添加属性与方法。如同:
var person = new Object();
person.name = "zhangsan";
person.age = "19";
person.job = "student";
person.sayName = function(){
alert(this.sayName);
};
用对象字面量创建时如下:
var person = {
name : "zhangsan",
age : 19,
job : "student",
sayName : function(){
alert(this.sayName);
}
<p>};</p>
但是需要创建多个对象时,这种方法会显得过于繁琐,于是有了以下的方法:
1.工厂模式(但是Javascript中无法创建类):抽象了创建具体对象的过程,解决了创建多个相似对象的问题,但是却无法知道一个对象的类型
function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.sayName);
};
return o;
}
var person1 = createPerson("zhangsan",19,"student");
var person2 = createPerson("lisi",29,"teacher");
2.构造函数模式:创建一个自定义的构造函数,并定义对象类型的属性与方法,创建实例时必须使用new操作符:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName(){
alert(this.name);
}
var person1 = new Person("zhangsan",19,"student");
var person2 = new Person("lisi",29,"teacher");
3.构造函数模式与原型模式的混合:使用最广泛的方法,既可以保留实例的独立属性,又可以共享对方法的引用:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["wanger","zhangwu'];
}
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}
var person1 = new Person("zhangsan",19,"student");
var person2 = new Person("lisi",29,"teacher");
person1.friends.push("chengyi");
alert (person1.friends); //"wanger,zhangwu,chengyi"
alert (person2.friends;) //"wanger,zhangwu"
alert (person1.sayName === person2.sayName); //true
可以看到,对person1添加了新的朋友“chengyi”,但是不会对person2产生影响,而共享的“wanger,zhangwu”则都保留了下来。同时,也可以共享原型中的sayName方法。
此外还有动态原型模式,寄生构造函数模式,稳妥构造函数模式等。不作记录,需要时再查找。