zoukankan      html  css  js  c++  java
  • 【js基础修炼之路】— 我理解的原型链

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


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

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

    记住,在你成功之前,每前进一步遇到的都将是更大的困难,所以微笑面对每一个困难 -----至有理想的自己
  • 相关阅读:
    退出窗口时出现“当”的响声
    屏幕设备环境
    修改一个完全颜色的CListCtrl类
    修改一个完全颜色的CListCtrl类
    MFC中CString.Format的详细用法
    网上阅卷系统自动识别功能代码
    mfc 子对话框数据传给父对话框
    already defined in *.obj
    Object 的使用
    this 函数执行上下文
  • 原文地址:https://www.cnblogs.com/-yu-ze-/p/10208689.html
Copyright © 2011-2022 走看看