分享

Javascript构建相似对象

 炫光83 2013-05-06
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(新对象)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多