原型链解释

一、什么是原型链

原型链是javascript中用来实现类似类继承的一套机制。像链条一样把javascript中的对象连接起来,实现类似子联系父的现象。

二、原型链的实现

总的来说,就是:

  • 对象的__proto__指向其构造器的prototype对象,然后该prototype对象的__proto__指向Function的prototype对象,最后该prototype对象的__proto__指向Object的prototype对象。
  • 对象的prototype对象中的constructor属性指向其构造器对象,不过constructor属性一般没什么用,不需要考虑。
    实际上原型链是通过__proto__来实现的,因为__proto__一直指向的都是prototype对象,给人的感觉就是顺着prototype对象查找的
    忽略__proto__,那么原型链的查找顺序链有两条,分别是:
    • 对象------构造器原型对象------Object原型对象
    • 构造器(函数)对象------Function原型对象------Object原型对象

三、一些测试

  • 对象真的没有prototype属性?

Object对象除外

  • 对象的__proto__指向构造器的prototype对象?

  • 构造器的prototype对象的__proto__指向Object的prototype对象?

即使特殊如Function和Object对象也是如此,Object的构造器是Function

  • 函数(构造器)对象的__proto__指向Function的prototype对象?

其实,也就是对象__proto__指向构造器的prototype对象

  • Function对象的__proto__指向其prototype对象?

Function的构造器指向其prototype对象,是比较特殊的,那么是不是意味着它的构造器是其本身,这个不太清楚

四、一些解释

  • 扩充函数

    复制代码
    Function.prototype.method = function(){}

上面扩充的method函数对象(包括全局对象浏览器中为window对象)并不能访问到,而函数可以访问到。这是因为对象的原型链不经过Function.prototype,而函数经过。而Object.prototype.method=function(){}不管函数还是对象都可以访问。

  • 扩充函数的改进

    复制代码
    Function.prototype.method = function(name, func){
      if(!this.prototype[name]){
        this.prototype[name] = func;
      }
      return this; 
    }
    Array.method('method', function(){
      // some code here
    });

上面代码通过给Function的原型对象添加一个method方法,用于给各函数(构造器)添加原型方法。

Array.method('arrayMethod',function(){});就是给Array的原型对象添加了arrayMethod方法,那么Array构造的对象就可以访问到这个方法。不过,使用Array.arrayMethod就不能访问这个方法。

相关推荐
Highcharts.js2 分钟前
常见报错排雷指南3:兼容性问题的官方解法
前端·javascript·react.js·可视化·highcharts·报错解法
bnmoel5 分钟前
C++ 基础入门篇(二):引用
开发语言·c++·引用·底层
言乐613 分钟前
Python加速器2视频网页加速器
前端·javascript·css·python·音视频
影视飓风TIM27 分钟前
C++ 智能指针:auto_ptr / unique_ptr / shared_ptr / weak_ptr 原理与使用
开发语言·c++
一木 之林32 分钟前
李沐《动手学深度学习》知识卡合集:从 Softmax 回归到房价实战(第24-50集)
开发语言·c++·人工智能
心中有你021432 分钟前
Java Swing实现校园最短路径导航系统(Dijkstra算法完整源码+详细解析)
java·开发语言·算法
Alphapeople35 分钟前
路径规划算法的python实现
开发语言·python·算法
志尊宝35 分钟前
Vue3 零基础每日笔记(017):事件处理进阶——$event、多事件与事件修饰符全家桶
javascript·vue.js·笔记
重生之小比特36 分钟前
【Java SE】数组的定义与使用
java·开发语言
旋生万物41 分钟前
圈道裂痕——用 Python 验证素数分布的螺旋生成论判据
开发语言·python·数论·素数·cci·可计算数学