js中创建对象的方式有以下几种:
- 工厂模式
示例1:
function creatPerson(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 = creatPerson('liming',18,'student');
函数creatPerson()能够根据接受的参数来构建一个包含所有必要信息的Person对象。可以无数次地调用这个函数,而每次它都会返回一个包含三个属性一个方法的对象。
- 工厂模式的缺点:虽然工厂模式解决了创建多个相似对象的问题,但却没有解决对象识别的问题(也就是怎么样知道一个对象的类型)。
- 构造函数模式
JavaScript中的构造函数可以用来创建特定类型的对象。
示例2:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
}
};
var person = new Person('tony',11,'student');
按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。我们可以看到示例2上,创建一个person实例,必须使用new操作符。
- 构造函数的问题:使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍。
- 原型模式
我们创建的每个函数都有一个Prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的多有实例共享的属性和方法。
示例3:
function Person(){
}
Person.prototype.name = "tony";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function () {
alert(this.name);
};
var person1 = new Person();
person1.sayName(); //"tony"
var person2 = new Person();
person2.sayName(); //"tony"
alert(person1.sayName == person2.sayName); //true
- 原型模式的缺点:首先,它省略了为构造函数传递初始化参数这一环节,结果所有实例在默认情况下都将取得相同的属性值。其次,也是原型模式最大的问题是由其共享的本性所导致的。实例一般都是要有属于自己的全部属性的。而这个问题正是我们很少单独使用原型模式的原因所在。