面向对象与原型05

/*
函数有prototype属性,对象有_proto_属性。

ar obj = new Object();
       // obj.a = 10;
        //obj.b = 20;
function Object(){
   this.a = 10;
   this.run = function(){
        alert(this.a);
  }
}
console.log(obj);
VM2480:11 Object {a: 10}a: 10run: ()__proto__: Objectconstructor: Object()arguments: nullcaller: nulllength: 0name: "Object"prototype: Object__proto__: ()<function scope>__proto__: Object

原型的最大的优点也是他最大的缺点 那就是共享 没有独立性 和共享 是它的两个问题

//原型创建的缺点
function Box(){};
Box.prototype = {
constructor :Box,///强制指向实例 而不是指向object
name:'zhao',
age:100,
family:["哥哥",'姐姐'],
run:function(){
return this.name+this.age+'运行中';
}
}
var box1 = new Box(); //第一个缺点是不能传参 不好传参  不能通过传参来修改里面的属性 
//如果在实例化一个box2 里面的name属性要改变 就弄不了



//我们可以通过构造函数和原型模式进行创建
function Box(name,age){ //保持独立的 用构造函数
this.name = name;
this.age = age;
this.family = ["哥哥",'姐姐'];
};
Box.prototype = {//可以共享的 用原型创建
constructor:Box,
run:function(){
return this.name+this.age+'运行中...';
}  
}
var box1 = new Box('LEE',100);
 var box2 = new Box('ffg',456);
 box1.family.push('滴滴');//给box1加了一个文字 但是box2不会共享  因为没有使用原型的方式
 //如果使用原型的方式 那就可以
 alert(box1.run());
  alert(box2.run());
  alert(box1.family);
  alert(box2.family);//引用类型没有使用原型,所以没有共享
  //end
  
  
  
*/


//构造函数和原型看起来像两个快 为了解决这个问题 我们可以使用动态原型模式
//可以将原型封装到构造函数里面
 function Box(name,age){ 
this.name = name;
this.age = age;
//alert('我是原型初始化'); 我是测试 原型初始化几次
this.family = ["哥哥",'姐姐'];
if(typeof this.run!='function'){//判断this.run是否存在 run是个方式 在对象里面就是个函数
//所以可以用等于函数的方式判断
Box.prototype.run  = function(){
return this.name+this.age+'运行中...';  
}
}
};  
//原型的初始化,只要第一次初始化就可以了,没必要每次构造函数实例化的时候都初始化
var box1 = new Box('LEE',100); //每次构造函数实例化 就是new一个 都会初始化原型 就是函数
 var box2 = new Box('ffg',456);
  alert(box1.run());
  alert(box2.run());
 //还要记住一点 如果重新写这个原型 那么就会切断实例和新原型之间的联系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值