博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【js基础修炼之路】— 我理解的原型链
阅读量:5141 次
发布时间:2019-06-13

本文共 1327 字,大约阅读时间需要 4 分钟。

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

*****

  • __ proto__

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

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

注意:

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


  • prototype 和 constructor

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

Function.prototype.bind()

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

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

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的属性,指向构造函数

转载于:https://www.cnblogs.com/-yu-ze-/p/10208689.html

你可能感兴趣的文章
leetcode-Sort List
查看>>
中文词频统计
查看>>
Java泛型的基本使用
查看>>
bzoj2038 [2009国家集训队]小Z的袜子(hose)
查看>>
Postman-----如何导入和导出
查看>>
【Linux】ping命令详解
查看>>
8、RDD持久化
查看>>
第二次团队冲刺--2
查看>>
[转载]加密算法库Crypto——nodejs中间件系列
查看>>
使用Xshell密钥认证机制远程登录Linux
查看>>
【模板】最小生成树
查看>>
java面试题
查看>>
pair的例子
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
Oracle中包的创建
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>
关于PHP会话:session和cookie
查看>>
C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
查看>>
利用IP地址查询接口来查询IP归属地
查看>>