Javascript构建相似对象 : 1 .工厂模式: 用函数封装以特定接口创建对象的细节 function createObject(arg1,arg2){ var obj=new Object() ; obj.arg1=arg1; obj.arg2=arg2; return obj; } 缺点: 可以无数次调用这个函数,而每次它都会生成一个包含二个属性的对象,但对于对象是什么类型的无法判断 2.构造函数模式 使用关键字new 创建一个新对象: 1.创建一个新对象(object) 2.将构造函数的作用域赋给新对象(object=this) 3.执行构造成函数内的代码(为新对象添加属性) 4.返回新对象 function Person(name,age,job) { this.name=name; this.age=age; ths.job=job; this.sayName=function(){ return this.name; }; } 优点:明确对象类型; 缺点:多个对象不共享构造函数内的方法。每次创建一个新对象都会创建一个新的sayName对象(Function对象的实例): 如果方法定义构造函数外部如下: function Person(name,age,job) { this.name=name; this.age=age; ths.job=job; this.sayName=sayName;// this.sayName=sayName.call(this); } function sayName() { retrun this.name; } 但是,如此一来,用构造函数对于所生成对象的封装性得不到保障。 3. 原型模式: 每个构造函数构建的对象中都有一个[[prototype]]属性,是一个指针。该属性由构造函数prototype指定的,指向一个对象,该对象中包含特定类型对象共享属性。 原型中有costructor 指向构构函数 function Person(){ } //为Person.prototype添加属性 //原型的constructor值Person Person.prototype.name="Nicholas"; Person.prototype.age=29; Person.prototype.sayName=function(){ alert(this.name); } /* //Person.prototype指向一个对象(Object 实例) //原型的constructor值为Object Person.prototype={ name:"Nicholas"; age:29; sayName: function(){ alert(this.name);} } */ 原型模式构建的对象属性查找顺序 : 1.对象内查找,找到属性并返回,如找不到,在原型中查找 2.原型中查找,找到属性并回,如找不到,返回 undefined(对象属性的数据特性:value 默认值为undefined) 所以原型具有动态性。可在对象创建前后,为原型添加属性或方法,不影响对象调用原型方法或查找属性 缺点:数据被所有实例共享,如一个实例修改数据,影响所有实例。构造函数不接收数据。 4。结和构造函数模式与原型模式 function Person(name,age,job) { this.name=age; this.age=age; this.job=job; } Person.prototype={ sayName:function(){ alert(this.name);} } var person1=new Person("Nicholas",29,"worker"); person1 对象过程: 由构造函数创新一个新对象,执行构造函数内代码,返回新对象,设置由Person.prototype指定的原型对象即新对象[[prototype]]属性值 总结:在构造函数中放置不共享的数据,在原型中放置共享属性; 5. 动态原型模式: 通过在构造函数中初始化原型; 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); } } } 刚开始,对Person.prototype有些疑惑,新对象中会不会为Person.prototype创建一个新的引用呢,答案是不会, 先看下在构造函数内Person.prototype的执行环境是window,而name,age,job变量的执行环境为this(新对象) |
|
来自: 炫光83 > 《JavaScript》