【js基础修炼之路】— 我理解的原型链

举报
无问东西 发表于 2019/01/02 16:06:37 2019/01/02
【摘要】 提起原型链,大家并不陌生,但是对于新人来说一提到原型方面的东西就会比较懵。在我自一次面试的时候,面试官也给我提了这样的问题,当时就按照我的理解说了一些,但是很肤浅,在此我希望给刚入门的前端小伙伴聊一下我理解的原型链。__ proto__这个属性是每个对象都有的属性,指向创建该对象的构造函数原型,其实这个属性指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们...

提起原型链,大家并不陌生,但是对于新人来说一提到原型方面的东西就会比较懵。在我自一次面试的时候,面试官也给我提了这样的问题,当时就按照我的理解说了一些,但是很肤浅,在此我希望给刚入门的前端小伙伴聊一下我理解的原型链。


  • __ proto__

这个属性是每个对象都有的属性,指向创建该对象的构造函数原型,其实这个属性指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们并不能访问到,所以使用 __ proto __ 来访问。

function add(){}
add.__proto__ === Function.prototype  //true

注意:
通过现代浏览器的操作属性的便利性,可以改变一个对象的 [[Prototype]] 属性, 这种行为在每一个JavaScript引擎和浏览器中都是一个非常慢且影响性能的操作,使用这种方式来改变和继承属性是对性能影响非常严重的,并且性能消耗的时间也不是简单的花费在 obj.__proto__ = ... 语句上, 它还会影响到所有继承来自该 [[Prototype]] 的对象,如果你关心性能,你就不应该在一个对象中修改它的 [[Prototype]].。相反, 创建一个新的且可以继承 [[Prototype]] 的对象,推荐使用 Object.create()


  • prototype 和 constructor

该属性只有函数才有,基本所有属性都有这个属性,但是有一个是例外:

Function.prototype.bind()

这个属性指的是对象的原型,该属性有一个属性constructor,constructor指向构造函数

function add(){}
add.constructor == Function //true

webp

image.png


  • new 的时候干了些什么

    1.生成一个新对象 {}
    2.链接到原型
    设置新对象的constructor属性为构造函数的名称,设置proto属性指 向构造函数的原型对象,扩展了新对象的原型链。
    3.绑定this
    4.返回this指针
    下面是一个new的过程

new Person("John") = {    var obj = {};
    obj.__proto__ = Person.prototype; // 此时便建立了obj对象的原型链:
    // obj->Person.prototype->Object.prototype->null
    var result = Person.call(obj,"John"); // 相当于obj.Person("John")绑定this指针
    return typeof result === 'object' ? result : obj; 
   // 如果无返回值或者返回一个非对象值,则将obj返回作为新对象}

总结
1.__ proto __所有对象都有,指向构造该对象的原型
2.prototype是对象的原型,只有函数有
3.constrctor是prototype的属性,指向构造函数


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。