• JS原型链


    1.原型链
    • 实例对象具有属性__proto__,指向它的原型对象。而原型对象也是对象,也具有属性__proto__,会继续指向它的原型对象。
    • 实例对象在访问属性时,先在自身找,找不到则沿着__proto__查找,我们把__proto__形成的链条关系称为原型链,可以理解为继承。
    2.演示原型链:

    1.实例对象自身的属性(第一层)

    1. function Person(name) {
    2. this.name = name
    3. this.listenMusic = function () {
    4. console.log('听音乐')
    5. }
    6. }
    7. const person = new Person('clz')
    8. console.log(person)
    9. console.log('实例对象本身是否有listenMusic方法', person.hasOwnProperty('listenMusic'))
    10. person.listenMusic()

    2.实例对象的原型对象上的属性(第二层)

    1. function Person(name) {
    2. this.name = name
    3. }
    4. Person.prototype.listenMusic = function () {
    5. console.log('听音乐')
    6. }
    7. const person = new Person('clz')
    8. console.log(person)
    9. console.log('实例对象本身是否有listenMusic方法', person.hasOwnProperty('listenMusic'))
    10. person.listenMusic()

    3.原型对象的原型对象上的属性(第三层)

    1. function Person(name) {
    2. this.name = name
    3. }
    4. Person.prototype.__proto__.listenMusic = function () {
    5. console.log('听音乐')
    6. }
    7. const person = new Person('clz')
    8. console.log(person)
    9. person.listenMusic()

    4.通过__proto__形成的链条,即原型链:

    person  =>  Person.prototype  =>  Object.prototype  =>  null

    5.图示:

    3.进阶(Function函数,Array数组)
    • 函数和数组都是对象,都继承自Object.prototype
    • 所有对象创建时都会自动生成_proto_属性(指针变量),所以构造函数也有_proto_属性

    测试代码:

    1. //数组
    2. let arr = [1, 2, 3];
    3. let str = arr.toString();
    4. console.log(str); //1,2,3
    5. console.log(arr.__proto__); //Array的原型对象
    6. console.log(Object.prototype); //Object的原型对象
    7. console.log(arr.__proto__ == Array.prototype); //true
    8. console.log(Array.prototype.__proto__ == Object.prototype); //true
    9. console.log(Array.prototype == Object.__proto__); //false
    10. //函数
    11. function User() {}
    12. let u1 = new User();
    13. let u2 = new User();
    14. console.log(User.prototype.constructor); //User构造函数
    15. console.log(u1.__proto__ === u2.__proto__); //true
    16. console.log(u1.__proto__ === User.__proto__); //false
    17. console.log(User.prototype === u1.__proto__); //true
    18. console.log(User.prototype.__proto__ === Function.prototype.__proto__); //true
    19. console.log(User.__proto__ === Function.prototype); //true
    20. console.log(User.__proto__ === Function.__proto__); //true
    21. console.log(Object.__proto__ == Function.prototype); //true
    22. console.log(Function.prototype == Function.__proto__); //true
    23. console.log(Function.prototype.__proto__ === Object.prototype); //true
    24. console.log(Function.__proto__.__proto__ === Object.prototype); //true

    数组很容易理解,但函数比较特殊,下面是它的图示:

  • 相关阅读:
    【MySql】mysql之索引
    Web APIs:事件高级--DOM事件流及DOM事件流程代码验证
    Banana Pi BPI-W3(ArmSoM-W3) RK3588编解码之MPP环境配置
    爆肝!92.3万字笔记让你彻底吃透分布式中的Spring Cloud微服务
    面向面试编程:分布式ID生成策略
    僵尸扫描实战
    【中间件】MQ是什么?RabbitMQ又是什么?
    【通信】Matlab实现改进的多同步压缩变换
    为什么要做知识管理
    springsecurity+vue实现登陆认证
  • 原文地址:https://blog.csdn.net/syyangg/article/details/134490719