原型对象使用的注意点

对于面向对象自己其实一直都挺糊涂的,就整理了一下面向对象中容易搞糊涂的几点 搞完以后觉得清晰多了

原型对象使用的注意点

### 1.如何访问原型上面的属性
- a.对象.属性
- b.构造函数.prototype.属性

2.属性的访问原则

  • 就近原则,在访问属性的时候,先在对象自身查找(实例属性/方法),如果找到那么就直接使用.如果没有找到就去它们的原型对象身上去找,如果找到就直接使用,如果没有找到就undefined或者报错

3.设置原型属性

  • 1.左值:如果是左值,那么在设置对象的属性的时候,不会去原型对象上面去找,查到自己是否有,如果有就修改,如果没有就添加.
  • 2,如果是右值,那么在取值的时候就先找自己,找不到就去原型身上找.
    • 左值就是赋值 右值就是取值
    • 列如:p1.hello=”hi ;左值
    • console.log(p1.hello); 右值
  • 3.设置原型属性的方法
    • a.只能通过构造函数.prototype.属性或者直接替换原型对象的方式来设置
    • b.如果原型对象的属性是引用类型的,那么通过对象的方式来进行设置
重点来了!!!!!!!
    function Person(){};

     Person.prototype.name='张三';
     Person.prototype.showName=function(){
            console.log(this.name);
     };
    var p1=new Person();
    var p2=new Person();
    p1.showName();//张三
  console.log(p1.name);//张三
    p1.name='李四'; //设置的是对象的实例属性,不能修改原型属性
  console.log(p1.name);//李四
 console.log(p2.name);//张三
    console.log(p1); //实例属性是李四,原型属性还是张三,不能修改原型属性
    console.log(p2); //给p1设置实例属性对p2没任何影响

结果看每行代码后面的注释
上面代码结构很简单 就是根据属性的访问规则:就近原则
p1.name先在实例属性上找name,没有,原型属性上有 拿过来用所以一开始是张三
当p1.name=李四;设置了实例属性,再找name发现实例属性上有,有就拿来用,就不用去原型上找了所以就是李四
但是p2没有设置实例属性,所以p2.name还是原型上的name张三

如果原型对象的属性是引用类型的


 function Person(){};

     Person.prototype.name='张三';
    Person.prototype.car={type:"火车",color:"red"};
    var p1=new Person();
    var p2=new Person();
    /*如果原型对象的属性是引用类型的*/
    console.log(p1.car.type);//火车
    p1.car.type='飞船';
    console.log(p1.car.type);//飞船
    console.log(p2.car.type);//飞船

对于 p1.car.type=’飞船’;代码读取方式是先读取p1.car 取值嘛就是右值,上面说过右值在自身上找 找到了再设置,没有就往原型上找,找到了发现有个car 然后修改car中type中的值改为飞船

QQ截图20170419205540.png

console.log(p1.car.type);//飞船 先读p1.car.自己没有,原型上找有 拿来用一找 找到了飞船
console.log(p2.car.type);//飞船 同理

看看另一种情况

function Person(){};

     Person.prototype.name='张三';

    Person.prototype.car={type:"火车",color:"red"};
    var p1=new Person();
    var p2=new Person();

//    /*如果原型对象的属性是引用类型的*/
    console.log(p1.car.type);//火车
    p1.car.type='飞船';
   console.log(p1.car.type);//飞船
 console.log(p2.car.type);//飞船

    p1.car={type:"火箭"};
    console.log(p1.car.type);//火箭
    console.log(p2.car.type);//飞船

p1.car={type:”火箭”}; 左值 自身没有添加并赋值 在自身身上添加和赋值

QQ截图20170419210828.png

console.log(p1.car.type);//火箭 先读p1.car发现自己有 直接用 所以是火箭
console.log(p2.car.type);//飞船 先读p1.car 发现没有 就往原型上找找到了拿来用

通过这几个例子应该明白了吧,最主要是运用左值和右值那么怎么变怎么改都没问题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值