原型与原型链

前提:javascript中的数据类型和判断方法:

数据类型

Boolean,Number,String是原始值boolean, number, string的包装类型,可以通过new创建对应的原始值

  • 值类型:undefined, number, string, boolean
  • 引用(对象)类型:函数(Function)、数组(Array)、对象(Object)、nullnew Number(10)(new构造器总是返回一个对象)等;

判断方法(整理过):

  • 值类型的类型判断用typeof;
  • 引用类型的类型判断用instanceof;

显式原型prototype

想必大家都听说过javascript里面一切皆对象,对象是属性的集合,对象(引用)类型中的函数(Function)是一种可执行的特别对象,数组(Array)是一种内部数据有序的、有数字下标的特殊对象。其中函数和数组跟对象的关系也不一样,数组可以看作对象的子集,函数和对象却不是包含的关系,函数是由对象创建的,而函数本身又是一种特殊的对象,由此我们引出prototype。

  • 每个函数都有一个属性叫做prototypeprototype的属性值是一个对象:
    • 这个对象中默认的只有一个叫做constructor的属性,属性指向这个函数本身(就是属性保存指向函数F 的一个引用);
    • 当然除了默认属性,还可以自定义添加很多属性,比如Object,它的prototype除了constructor之外还有我们熟悉的:
      • hasOwnProperty(function):
      • isPrototypeOf(function):
      • propertyIsEnumerable(function):
      • toLocaleString(function):
      • toString(function):
      • valueOf(function):
    • 以上是Object原生的prototype属性,方便开发我们还可以自己在prototype上定义一些属性,这就常用在项目中对Object的封装,比如:
      • Object.prototype.myName = 'javascripe'
      • Object.prototype.myFn = function () {//to do}

隐式原型__proto__

  • 每个对象都有一个隐藏的属性——__proto__,这个属性引用了创建这个对象的函数的prototype,即如果: let obj = new Object() // obj是对象 通过函数创建
    那么obj.__proto__ === Object.prototype;
  • 到这里问题又来了!Object.prototype不也是个对象吗,那么它也有__proto__,这个__proto__指向那里呢? Object.prototype的__proto__指向null 原因:
    • 回到最初说的javascript里面一切皆对象,所以对象Object就是最顶层的;
    • 为了打破函数和对象的这种复杂关系,Object的原型对象是原型链尽头,即console.log(Object.prototype.__proto__) // null
  • 同样的函数也是一种对象,函数的__proto__指向哪里呢?
    • 函数也是被创建出来的。所有函数都是Function的实例(包含Function,Function是被自身创建的)
    • 根据对象的__proto__指向的是创建它的函数的prototype就有
    Function.__proto__ === Function.prototype
    Object.__proto__ === Function.prototype
    Function.prototype.__proto__ ===Object.prototype
    

原型链:访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。

posted @   Rain1112022  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示