1. 创建对象的几种模式
虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。
- 工厂模式
function createPerson (name, age, job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
return o;
}
var person1 = createPerson('john', 23, 'police');
var person2 = createPerson('lily', 24, 'doctor');
- 构造函数模式
function Person (name, age, job){
this.name = name;
this.age = age;
this.job = job;
}
var person1 = new Person('john', 23, 'police');
var person2 = new Person('lily', 24, 'doctor');
以上两种方法存在几种不同之处:
<1 没有显式地创建对象
<2 直接将属性和方法赋给了this对象
<3 没有return语句
此外还应注意到函数名Person都是用的是大写字母P,按照惯例,构造函数始终都应该以一个大写字母开头,非构造函数应该以一个小写字母开头。
要创建Person的新实例,必须使用new操作符,以这种方式调用构造函数会经历以下四个步骤:
<1 创建一个新对象
<2 将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
<3 执行构造函数中的代码(为这个新对象添加属性)
<4 返回新对象
- 原型模式
我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
function Person () {
Person.prototype.name = 'john';
Person.prototype.job = 'police';
Person.prototype.age = 24;
Person.prototype.sayName = function () {
alert(this.name);
}
}
var person1 = new Person();
person1.sayName();
var person2 = new Person();
person2.sayName();
- 组合使用构造函数模式和原型模式
function Person (name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ['Shelby', 'Count'];
}
Person.prototype = {
constructor: Person,
sayName: function () {
alert(this.name);
}
};
var person1 = new Person('john', 23, 'police');
var person2 = new Person('lily', 25, 'teacher');
person1.friends.push('Van');
alert(person1.friends);
alert(person2.friends);
网友评论