- 工厂模式
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('Nike',29,'teacher');
var person2 = createPerson('Arvin',20,'student');
- 构造函数模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person('Nike',29,'teacher');
没有return语句,直接将属性和方法赋给了this对象
每个方法都要在每个实例上重新创建一遍,方法指的就是我们在对象里面定义的函数。
如果方法的数量很多,就会占用很多不必要的内存。
- 原型模式
function Person(){}
Person.prototype.name = 'Nike';
Person.prototype.age = 20;
Person.prototype.jbo = 'teacher';
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName();
共享了属性
没法传参
为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性。
- 组合构造函数和原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
}
Person.prototype = {
constructor:Person,
sayName: function(){
alert(this.name);
};
}
var person1 = new Person('Nike',29,'teacher');
- 动态原型模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
if(typeof this.sayName!="function"){
Person.prototype.sayName=function(){
alert(this.name);
};
}
}
仅在sayname不存在时,添加到原型。
这只会在初次调用构造函数时才会执行。
- 寄生构造函数模式
function Person(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 person2 = new Person('Arvin',20,'student');
跟工厂模式差不多,用了new
- 稳妥构造函数模式
- Object.create()
- 混合工厂方式
- 通过Object.setPrototypeOf创建对象。
es5
以上通过封装函数体方法, 下面都是用了同一个接口创建很多对象,会产生大量的重复代码
- Object构造函数创建或者字面量
var Person = new Object();
Person.name = 'Nike';
Person.age = 29;
var Person = {};//相当于var Person = new Object();
var Person = {
name:'Nike';
age:29;
}