最近想自己搭建个网站玩玩,发现JavaScript创建对象的几种模式自己从来都没有仔细学过,所以现在就来详细总结一下面向对象的九种方式吧。我是参考的《JavaScript高级程序设计》来做总结的。
1.创建一个Object实例,最简单的方式。
这个方式是创建一个Object实例,然后再为这个实例添加属性和方法。
例:
var person=new Object();
person.name="Nicholas";
person.age=29;
person.job="Software Engineer";
person.sayName=function(){
alert(this.name);
};
2.对象字面量方式
{}表示一个对象。
例:
var person={
name:"Nichloas",
age:29,
job:"Software Engineer",
sayName: function(){
alert(this.name);
}
};
前面两种方式最大的缺点是:使用同一个接口创建很多对象,会产生大量重复的代码。
3.工厂模式
在ECMAScript中无法创建类,所以开发人员就发明了一种函数,用函数来封装特定接口创建对象的细节。(就是将Object创建方式(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("Nichloas",29,"Software Engineer");
var person2=createPerson("Greg",27,"doctor");
工厂模式虽然解决了创建多个相似对象的问题,但是没有解决对象识别的问题,即如何知道一个对象的类型。
4.构造函数模式
ECMAScript中的构造函数可用来创建特定类型的对象。可以自定义对象,从而定义对象的属性和方法。构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。
例:
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
};
}
var person1=new Person("Nichloas",29,"Software Engineer");
var person2=new Person("Greg",27,"doctor");
需要注意的有两点:
(1)将构造函数当作函数
构造函数和其他函数的唯一区别,就在于调用方式不同。不过,构造函数也是函数,不存在定义构造函数的特殊语法。换句话说,任何函数,只要通过new操作符调用,那它就可以作为构造函数;而任何函数,只要不通过new操作符调用,那么它和普通函数也不会有什么区别。在前面给出的例子里:定义的Person()函数,可以通过下列任何方式来调用,只不过作用域不同。
//当作构造函数使用
var person=new Person("Nichloas",29,"Software Engineer");
person.sayName();
//作为普通函数调用
Person("Greg",27,"Doctor");//属性和方法添加到window中
window.sayName();
//在另一个对象的作用域内调用Person()构造函数
var o=new Object();
Person.call(o,"Kristen",25,"Nurse");
o.sayName();
(2)构造函数的缺点
使用构造函数最大的问题就是,每个方法都要在每个实例上面重新创建一遍。在ECMAScript中的函数就是对象,因此每定义一个函数,就是实例化了一个对象。在前面的例子中,person1和person2都有一个名为sayName()方法,但这两个方法不是指向同一个Function的实例。
5.原型对象
创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象。而这个对象的用途就是包含可以由特定类型的所有实力共享的属性和方法。当然来prototype就是通过调用构造函数而创建的那个对象实例的原型对象。以后会