上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: 陈公子的话 - 

JS原型链

[复制链接]
  • TA的每日心情

    前天 22:44
  • 签到天数: 416 天

    [LV.9]以坛为家II

    148

    主题

    423

    回帖

    1133

    积分

    版主

    积分
    1133

    油中2周年生态建设者

    发表于 2021-2-25 18:54:44 | 显示全部楼层 | 阅读模式

    本帖最后由 小陈 于 2021-2-25 18:56 编辑

    js原型链

    首先我们要知道任何对象都有一个proto属性
    任何的方法都有prototype属性,prototype也是一个对象,也是有proto属性的

    image.png

    定义一个函数fn,调试出它的prototype属性,可以看到结果中有constructor和proto

    constructor指向函数自己。同时可以看见prototype中也有proto

    JS创建对象

    第一种是通过构造函数创建对象

    var obj=new Object();

    第二种是object.create创建对象

    var obj1={};
    var obj2= Object.create(obj1);
    

    第三种花括号创建

    var obj={};

    所有的对象中都有proto属性,这个属性就是一个指针,指向构造函数中的prototype属性。

    image.png

    所有对象的proto指向创建它们的构造函数的prototype

    image.png

    我们验证一下。

    image.png

    image.png

    总结

    1函数对象有proto和prototype属性
    2非函数对象只有proto属性
    3prototype中有proto属性。且是Object构造函数创建的
    4函数对象proto指向它的创建者及Function构造函数
    5Function构造函数proto指向它自己
    6Object对象的prototype中的proto是null

    I don't hate programming but the fucking world.
  • TA的每日心情

    前天 22:44
  • 签到天数: 416 天

    [LV.9]以坛为家II

    148

    主题

    423

    回帖

    1133

    积分

    版主

    积分
    1133

    油中2周年生态建设者

    发表于 2021-2-25 19:55:34 | 显示全部楼层
    首先知道javascript所有对象都是object实例,并且继承Object.prototype的属性和方法

    当我们定义函数a的时候,会自动生成一个prototype对象,那prototype对象,它是对象他就有__proto__属性,那函数a.prototype.__proto__其实就是Object.prototype

    当我们定义一个对象b的时候,会自动生成__proto__属性,那么b.__proto__其实就是构造函数B.prototype   再延伸一下B.prototype.__proto__又回到我们说的Object.prototype

    原型链是什么呢   

    对象都有toString这个方法,就像上面说的实例化对象b,b本身没有tostring这个方法,然后通过__proto__方法向上延伸,b.__proto__其实就是B.prototype,构造函数B也没tostring这个方法,继续通过__proto__向上找,B.prototype.__proto__也就是Object.prototype有tostring这个方法 ,实例化对象b才继承了这个方法

    这个过程中Object.prototype = b.__proto__.__proto__
    I don't hate programming but the fucking world.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    620

    主题

    5087

    回帖

    5960

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    5960

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2021-2-26 00:24:28 | 显示全部楼层
    考试题:
    function CreateObj(){
    this.a=888;
    }
    var a=new CreateObj
    a.__proto__===?
    CreateObj.prototype.__proto__===?
    CreateObj.__proto__===?
    Function.__proto__===?
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情

    前天 22:44
  • 签到天数: 416 天

    [LV.9]以坛为家II

    148

    主题

    423

    回帖

    1133

    积分

    版主

    积分
    1133

    油中2周年生态建设者

    发表于 2021-2-26 15:20:18 | 显示全部楼层
    a.__proto__ ===CreatObj.prototype
    CreateObj.prototype.__proto__=== Object.prototype
    CreateObj.__proto__=== CreateObj.constructor.prototype
    Function.__proto__===Function.prototype
    I don't hate programming but the fucking world.
    回复

    使用道具 举报

  • TA的每日心情

    前天 22:44
  • 签到天数: 416 天

    [LV.9]以坛为家II

    148

    主题

    423

    回帖

    1133

    积分

    版主

    积分
    1133

    油中2周年生态建设者

    发表于 2021-2-26 15:28:20 | 显示全部楼层
    CreateObj.__proto__=== CreateObj.constructor.prototype===Function.__proto__===Function.prototype
    I don't hate programming but the fucking world.
    回复

    使用道具 举报

  • TA的每日心情

    前天 22:44
  • 签到天数: 416 天

    [LV.9]以坛为家II

    148

    主题

    423

    回帖

    1133

    积分

    版主

    积分
    1133

    油中2周年生态建设者

    发表于 2021-2-26 15:33:59 | 显示全部楼层
    a.__proto__ ===a.constructor.prototype===CreatObj.prototype
    I don't hate programming but the fucking world.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    620

    主题

    5087

    回帖

    5960

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    5960

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2021-2-26 18:44:15 | 显示全部楼层
    小陈 发表于 2021-2-26 15:33
    a.__proto__ ===a.constructor.prototype===CreatObj.prototype

    ggnb!
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表