一、使用Object构造函数或对象字面量创建对象
var person = new Object()
person.name = 'adhehe';
person.age = 23;
//...
//或
var person = {
name:'adhehe',
age:23,
//...
}
缺点:使用同一个接口创建很多的对象,会产生大量的重复代码。
二、工厂模式
这种模式抽象了创建具体对象的过程。用函数来封装以特定接口创建对象的细节。
function createPerson(name,age){
//将创建的具体细节封装起来,最后返回一个对象 var o = new Object(); o.name = name; o.age = age; o.getName = function(){ return this.name; } return o; } var person1 = createPerson('adhehe',23); var person2 = createPerson('Jhone',45);
缺点:虽然解决了创建多个相似对象的问题,但没有解决 对象识别的问题,即怎么知道一个对象的类型
三、构造函数模式
构造函数可以用来创建特定类型的对象。如Object、Array等。也可以创建自定义构造函数。
function Person(name,age){ this.name = name; this.age = age; this.getName = function(){ return this.name; } } var person1 = new Person('adhehe',23); var person2 = new Person('Jhone',45);
以new关键字创建Person的实例,经历以下4个步骤:
- 创建一个新对象
- 将构造函数的作用域赋给了新对象(即this指向了这个新对象)
- 执行 构造函数中的代码(即为新对象添加属性)
- 返回新对象
instanceof 操作符 可以检测对象的类型
//以person为例 console.log(person1 instanceof Person) console.log(person2 instanceof Person) console.log(person1 instanceof Object) console.log(person2 instanceof Object) //都输出 true
构造函数与普通函数的唯一区别是:调用的方式不同。只要通过new操作符调用,它就是构造函数。
缺点:每个方法都要在每个实例上重新创建一遍。
//以上面 person为例 person1.getName == preson2.getName //false
四、原型模式
创建的每个函数都有一个prototype(原型)属性,它是一个指针,批向一个对象,而这个对象的用途就是:包含可以共享的属性和方法,给那些特定类型的所有实例。
function Person(){} Person.prototype.name = 'adhehe' Person.prototype.age = 23 Person.prototype.getName = function(){ return this.name; } var preson1 = new Person() var preson2 = new Person() console.log(person1.getName()) console.log(person2.getName()) //都返回 adhehe person1.getName == person2.getName //true