思考题答案,请老师指正,谢谢

来源:2-6 思考题:对象变量.__proto__.方法 和对象变量.方法的不同【原理加固题】

起点丶

2022-07-01

他们的 this 指向不同:

  • QQZhangSan.proto.show() // this 指向为 QQUsers.prototype
    – 因此输出的时候 this.QQNo、this.QQAge、this.QQMark 全是 undefined
  • QQZhangSan.show() // this 指向为 QQZhangSan 实例
  • 但是他们都引用同一块内存空间 QQZhangSan.proto.show === QQZhangSan.show 结果是 true
写回答

3回答

keviny79

2022-07-01


首先答案是:

QQZhangSan.__proto__.show() 和QQZhangSan.show()区别如下:
  1. 当只有原型上有show()方法, 而实例上没有show()方法 区别如下:
    1.1 QQZhangSan.__proto__.show() 中的show方法this始终指向原型对象空间
    因为只有commonfriends为原型对象空间中的属性,所以能输出好友信息
    其他的this.QQNo,this.QQAge this.QQMark都为undefined

    1.2 QQZhangSan.show()会首先从实例对象空间查找show()方法,但是没有找到,
    就顺着__proto__【后面说的原型链属性】找到原型对象空间中的show()方法
    此刻show()方法中的this表示QQZhangSan实例对象变量,
    this.QQNo,this.QQAge this.QQMark都能直接输出,this.commonfriends
    会继续查找原型对象空间,在输出好友信息

  2. 当原型和实例上都有show()方法,区别如下:
     2.1 QQZhangSan.__proto__.show()输出和上面1.1 完全相同 [this 还是指向原型对象空间]
     2.2 QQZhangSan.show()会直接从实例对象空间找到show()方法,输出结果和规律上1.2完全相同

1
1
起点丶
非常感谢!
2022-07-01
共1条回复

keviny79

2022-07-01

*****

但是他们都引用同一块内存空间 QQZhangSan.proto.show === QQZhangSan.show 结果是 true

这句话不完全对, 

当 QQUsers 中有 show  实例方法时,返回false,  如果没有,会顺着__proto__原型链上找到show方法,这时才返回true

function QQUsers(QQNo_, QQAge_, QQMark_) {

  this.QQNo = QQNo_ //QQ号

  this.QQAge = QQAge_ //Q龄

  this.QQMark = QQMark_ //QQ标签

  this.show = function () {//show  实例方法

     console.log("show:")

   }

}


1
0

weixin_慕妹0220249

2022-11-14

就目的而言,没啥区别。走的路不同而已,一个直接找老爹要,一个先找自己要,再找老爹要

0
0

晋级TypeScript高手,成为抢手的前端开发人才

轻松驾驭 TypeScript 高级用法, 突破前端成长瓶颈

871 学习 · 425 问题

查看课程