创建对象

144 阅读1分钟
  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('Nike',29,'teacher');
var person2 = createPerson('Arvin',20,'student');
  1. 构造函数模式
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对象
每个方法都要在每个实例上重新创建一遍,方法指的就是我们在对象里面定义的函数。
如果方法的数量很多,就会占用很多不必要的内存。
  1. 原型模式
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();

共享了属性
没法传参
为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性。
  1. 组合构造函数和原型模式
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');
  1. 动态原型模式
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不存在时,添加到原型。
这只会在初次调用构造函数时才会执行。
  1. 寄生构造函数模式
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
  1. 稳妥构造函数模式
  2. Object.create()
  3. 混合工厂方式
  4. 通过Object.setPrototypeOf创建对象。
es5

以上通过封装函数体方法, 下面都是用了同一个接口创建很多对象,会产生大量的重复代码

  1. Object构造函数创建或者字面量
var Person = new Object();
Person.name = 'Nike';
Person.age = 29;

var Person = {};//相当于var Person = new Object();
var Person = {
 name:'Nike';
 age:29;  
}