• 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

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

  • 相关阅读:
    力扣(LeetCode)30. 串联所有单词的子串(C++)
    数控机床工作平台位置伺服系统的的数学建模与仿真
    [Go]配置国内镜像源
    flink cep数据源keyby union后 keybe失效
    python基础语法(七)
    二、综合——法律法规
    SqlServer复习
    stm32、IO口、中断、串口、定时器讲解
    c++ 高阶函数 numeric库
    【模板语法+数据绑定+el与data的两种写法+MVVM模型】
  • 原文地址:https://blog.csdn.net/syyangg/article/details/134490719