原型与原型链
前提:javascript
中的数据类型和判断方法:
数据类型
Boolean
,Number
,String
是原始值boolean
,number
,string
的包装类型,可以通过new创建对应的原始值
- 值类型:
undefined
,number
,string
,boolean
; - 引用(对象)类型:函数(Function)、数组(Array)、对象(Object)、
null
、new Number(10)(new构造器总是返回一个对象)
等;
判断方法(整理过):
- 值类型的类型判断用typeof;
- 引用类型的类型判断用instanceof;
显式原型prototype
想必大家都听说过javascript里面一切皆对象,对象是属性的集合,对象(引用)类型中的函数(Function)是一种可执行的特别对象,数组(Array)是一种内部数据有序的、有数字下标的特殊对象。其中函数和数组跟对象的关系也不一样,数组可以看作对象的子集,函数和对象却不是包含的关系,函数是由对象创建的,而函数本身又是一种特殊的对象,由此我们引出prototype。
- 每个函数都有一个属性叫做prototype,
prototype
的属性值是一个对象:- 这个对象中默认的只有一个叫做
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现