工厂模式
function createPerson(name, job) {
var o = new Object();
o.name = name;
o.job = job;
o.sayName = function (){
console.log(this.name);
}
return o;
}
var person1 = createPerson('Jiang', 'student');
var person2 = createPerson('X', 'Doctor');
工厂模式解决了创建多个相似对象的问题,但是没有解决对象识别问题,即不能知道一个对象的类型。
构造函数模式
function Person(name, job){
this.name = name;
this.job = job;
this.sayName = function() {
console.log(this.name);
}
}
var person1 = new Person('Jiang', 'student');
var person2 = new Person('X', 'Doctor');
使用new后自动执行如下操作:
- 创建一个对象
- 新对象会被执行[[prototype]]链接
- 新对象会绑定到函数调用的this
- 返回这个对象
使用这个方式创建对象可以检测对象类型
person1 instanceof Object // true
person2 instanceof Person // true
但是使用构造函数创建对象,每个方法都要在每个实例上重新创建一次
动态原型模式
function Person() {
// 属性
this.name = name;
this.job = job;
// 方法
if(typeof this.name !== 'function'){
Person.prototype.sayName = function(){
console.log(this.name);
}
}
}
var person1 = new Person('Jiang', 'Student');
person1.sayName();
只有sayName方法不存在时候,才会将它添加到原型中。