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


  • __ 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


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

最新文章

  1. 自定义NSLog
  2. 【追寻javascript高手之路01】javascript参数知多少?
  3. redis连接数
  4. iOS 设计模式之工厂模式
  5. IE6文字溢出BUG(多出来的猪问题)
  6. Vim cscope
  7. Python Tutorial 学习(六)--Modules
  8. windows7中的“mklink命令” 转
  9. 直接修改别人jar包里面的class文件 工具:jclasslib
  10. poj 3187 Backward Digit Sums(穷竭搜索dfs)
  11. 16.java.lang.InterruptedException
  12. L2-012. 关于堆的判断
  13. [C++ Calculator 项目] 初试
  14. 解决yii2中 Class yii/web/JsonParser does not exist, ReflectionException问题
  15. HTML5制作网页(2)
  16. MySQL InnoDB 索引组织表 & 主键作用
  17. 2019-1-11 SQL语句汇总——聚合函数、分组、子查询及组合查询
  18. C#开发Unity游戏教程之游戏对象的属性变量
  19. 【cocos2dx中Node类getParent和getChildByTag()】学习体会
  20. 【Spring】SpringMVC中浅析数据的传递方式

热门文章

  1. MS SqlServer 随机查询并随机排序
  2. java反射之一
  3. Mock Server利器 - Moco
  4. thinkPHP5.0表单令牌使用
  5. 使用vue-cli脚手架安装和webpack-simple模板项目生成
  6. hybird app 工具选型
  7. ssh RSA key变化后处理
  8. WPF调用Win Form
  9. jQuery源代码学习笔记_01
  10. Echarts学习笔记