对象创建

+++++++++++++++++++++++++++++++++++++++
创建对象                                                                          ++
+++++++++++++++++++++++++++++++++++++++
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 person1=Person("loo","24","Software Engineer");


++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++


2.构造函数模型:
function  Person(name,age,job){
     this.name=name;
     this.age=age;
     this.job=job;
     this.sayName=function(){
           alert(this.name);            
     };
}
//创建实例;
var person1=new Person("loo","24","Software Engineer");
var person2=new Person("ho","24","Software Engineer");


//调用方法
person1.sayName(); //"loo"
person2.sayName(); //"ho"
alert(person1.sayName==person2.sayName);  //false;
//可以发现person1和person2中的方法是不同的。即实现相同任务,在不同实例中,
//虽然使用的是构造函数中的同一方法,但是这个方法在每个实例中是不一样的;
//这是因为每次实例时,都会重新新建这个方法(可以初始化构造函数的原型===参见动态原型模式)
//


/*构造函数模式:每个实例都具有一个constructor属性指向构造函数,在此例中,
 *person1和person2 的constructor均指向Person。
 * person1和person2 即是Object的实例,又是Person的实例。
 */
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++


3.原型模式:
function Person(){
      Person.prototype.name="loo";
      Person.prototype.age=24;
      Person.prototype.job="Software Engineer";
      Person.prototype.sayName=function(){
                alert(this.name);
      };
}
//实例化
var person1=new Person();
var person2=new Person();
alert(person1.sayName==person2.sayName); //true
/*每个创建的函数都有一个原型属性(prototype),
  *prototype属性指向它的原型对象,
  *原型对象又具有一个constructor属性,这个属性指向构造函数;
  *实例后,每个实例包含一个内部指针[[prototype]]指向原型对象。
  *
  *实例的属性和方法的查找:从实例开始查找,在实例自身上没有找到,就往上到原型对象上查找。
  *实例的属性和方法的添加:
  *原型模式就是将所有属性和方法添加到构造函数的prototype属性上,
  *也就是说构造函数是一个空函数
  *
  *原型模式所创建的方法和属性都是共享的,对于方法来说,这是极好的,
  *默认情况下,新创建的实例都具有相同的属性和方法,对于包含基本类型值的属性,
  *可以通过修改使其拥有与其他实例不同值的属性(主要是阻止属性向原型对象上查找),
  *但对于包含引用型值的属性,比如属性的值是一个数组,
  *若改变单个实例上的属性值,则会改变原型对象上的属性值。
  * 这是原型模式的缺点所在
  *
  *!!!!!可以先重写原型,再创建实例,但是如果已经创建了实例,再通过字面量重写原型,
  *会切断已经存在的实例与新原型的联系!!!!!
 */
//确定属性是属于实例还是原型;
function   hasPrototypeProperty(object,name){
        return  !object.hasOwnProperty(name)&&(name in object);
}
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
4.构造与原型的组合模式(应用最多的对象创建模式)
//使用构造函数模式定义实例属性;而使用原型模式定义方法和共享的属性
function Person(name,age,job){
         this.name=name;
         this.age=age;
         this.job=job;
         this.friends=["a","b"];
}
Person.prototype={
        constructor : Person,
        sayName : function(){
                 alert(this.name);
         }
}
//创建实例;
var person1=new Person("loo","24","Software Engineer");
var person2=new Person("ho","24","Software Engineer");
person1.friends.push("c");
alert(person1.friends);  // a,b,c
alert(person2.friends);  //a,b
alert(person1.sayName==person2.sayName); //true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值