js原型链上面的炕:通过实例对象修改原型(链)上面的属性

js原型链上面的炕:通过实例对象修改原型(链)上面的属性

js:通过实例对象修改原型(链)上面的属性
1 原型对象属性是基本数据类型
2 原型对象的属性为引用类型
3 总结(只是把前面的copy一下,方便记忆)

js:通过实例对象修改原型(链)上面的属性

我是在学习原型链继承的时候发现的,学习真能让人发现问题。
这里分原型对象中属性为基本数据类型和引用数据类型两种。
而引用数据类型又分为整体修改还是只是修改引用类型的属性(注意不是原型的属性,而是原型属性(引用类型)的属性,是原型中引用类型的属性。)两种。下面先分别说明,最后总结。

1 原型对象属性是基本数据类型

当原型对象的属性为基本数据类型时,通过实例对象修改原型上面的属性,并不会修改原型对象的属性,而是在该实例对象创建了一个同名属性。

//构造函数
 
  function SuperType(age) {
    this.age = age;
}
  //重写构造函数的原型
  SuperType.prototype = { //原型是一个对象
    name: "super"
    color: ["red", "blue", "yellow"],
    printName: function () {
        console.log(name);
    }
}
 
  //创建实例对象
  let obj__1 = new SuperType(16);  //实例对象1
  let obj__2 = new SuperType(18); //实例对象2
 
 
//通过实例对象修改原型上面的属性(属性为基本类型),并不是修改,而是在该实例对象创建了一个同名属性
  console.log(obj__1.name);  //super
  console.log(obj__2.name);  //super
  obj__1.name = "obj__1";  //修改属性
 
  console.log(obj__1.name);  //obj__1   通过上面的这条语句修改,是在实例对象obj__1里面添加了属性name,对原型没有影响。读取obj__1.name时,会先读取自己有的属性
  console.log(obj__2.name);  //super  读取obj__2.name时,先看obj__2,因为obj__2没有name属性,所以从原型上面读取

2 原型对象的属性为引用类型

1)当原型对象的属性为引用类型时,如果通过实例对象整体修改该引用类型(直接将另外的值赋给它),并不会修改原型对象对应的引用类型,而是在该实例对象创建了一个同名属性。

//构造函数
 
  function SuperType(age) {
 
    this.age = age;
 
}
 
 
 
  //重写构造函数的原型
 
  SuperType.prototype = { //原型是一个对象
 
    name: "super",
 
    color: ["red", "blue", "yellow"],
 
    printName: function () {
 
        console.log(name);
 
    }
 
}
 
 
 
  //创建实例对象
 
  let obj__1 = new SuperType(16);  //实例对象1
 
  let obj__2 = new SuperType(18); //实例对象2
 
 
 
//通过实例对象修改原型上面的引用类型,如果整体修改该引用类型,并不是修改,而是在该实例对象创建了一个同名属性,不改变原型上面的引用类型
 
  console.log(obj__1.color);  //[ 'red', 'blue', 'yellow' ]
 
  console.log(obj__2.color);  //[ 'red', 'blue', 'yellow' ]
 
  obj__1.color = [ "white", "black" ];  //整体修改引用类型,===实例对象创建了一个同名属性
 
  console.log(obj__1.color);  //[ 'white', 'black' ]  先访问实例对象的本身属性color,发现有该属性
 
  console.log(obj__2.color);  //[ 'red', 'blue', 'yellow' ]  先访问实例对象的本身属性color,发现没有该属性,访问原型上面的color

2)当原型对象的属性为引用类型时,如果通过修改该引用类型(也称对象,每一个对象都是键值对的组合)的属性,会直接修改原型上面的引用类型。

//构造函数
 
  function SuperType(age) {
 
    this.age = age;
 
}
 
 
 
  //重写构造函数的原型
 
  SuperType.prototype = { //原型是一个对象
 
    name: "super",
 
    color: ["red", "blue", "yellow"],
 
    printName: function () {
 
        console.log(name);
 
    }
 
}
 
 
 
  //创建实例对象
 
  let obj__1 = new SuperType(16);  //实例对象1
 
  let obj__2 = new SuperType(18); //实例对象2
 
 
 
//通过实例对象修改原型上面的引用类型,如果修改该引用类型(也称对象,每一个对象都是键值对的组合)的属性,会修改原型上面的引用类型
 
  console.log("______________分割线____________________");
 
  console.log(obj__1.color);  //[ 'red', 'blue', 'yellow' ]
 
  console.log(obj__2.color);  //[ 'red', 'blue', 'yellow' ]
 
  obj__1.color[1] = "white";  //修改引用类型其中的属性(也可以使用能直接改变原数组的数组方法改变color),===改变了原型上面的引用类型
 
  console.log(obj__1.color);  //[ 'red', 'white', 'yellow' ]  先访问实例对象的本身属性color,发现没有该属性,访问原型上面的color
 
  console.log(obj__2.color);  //[ 'red', 'white', 'yellow' ]  先访问实例对象的本身属性color,发现没有该属性,访问原型上面的color

3 总结(只是把前面的copy一下,方便记忆)

在这里插入图片描述
当原型对象的属性为基本数据类型时,通过实例对象修改原型上面的属性,并不会修改原型对象的属性,而是在该实例对象创建了一个同名属性。

当原型对象的属性为引用类型时,会有两种情况:如果通过实例对象整体修改该引用类型(直接将另外的值赋给它),并不会修改原型对象对应的引用类型,而是在该实例对象创建了一个同名属性;如果通过修改该引用类型(也称对象,每一个对象都是键值对的组合)的属性,会直接修改原型上面的引用类型。

原文链接:https://blog.csdn.net/abc1194474469/article/details/107335756

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值