js/ts prototype最简单且深刻的理解

最关健的二点:
1. js任何对象(函数也是对象)都有__proto__私有属性,有的可能会显示[[Prototype]] (chorme浏览器),代码直接访问属性会报错,但可以正常运行的。__proto__只是另一个对象的引用(一般是类型对象,也可以修改)。

2. 只有函数对象Function才有 .prototype属性,它本身就是一个对象,给其它对象提供共享属性和方法的对象。是可以正常访问,每个prototype对象都有constructor属性,它是构造函数的引用。

补充: 所有内置类型是一个Function对象,因此可以修改Number.prototype( TypeScript 不允许直接扩展原生类型,可以使用类型守卫或类型断言来规避 TypeScript 的类型检查,但这种做法需要谨慎考虑)

通过下面例子来解释上面二名话:
class A{};
定义了A类,其实定义了二个类型: A类型和 typeof(A)类型(A.prototype.constructor的类型)。就和内置类型number与Number,string与String是一样的。
const a:typeof A = A; // typeof A 可以是A或者A的子类
const b:A = new A(); // b是调用了constructor才生成的对象
为什么会这样?js原本是没有class定义的,是通过函数和prototype对象来实现其它语言类的功能(其它语言定义一个类后,只有一个类型),所以
A.proto = Function.prototype;
b.proto = A.prototype;
prototype属性,它本身就是一个对象,所以
Function.prototype.proto = Object.prototype
A.prototype.proto = Object.prototype
Object.prototype.proto = null

再看一个例子
const aa:number =1;
aa.proto = Number.prototype; Number.prototype.proto =Object.prototype;
Number.proto = Function.protoype; Function.protoype.proto = Object.prototype;
内置类型也是和自定义类型一样的

好像真的就是二句话就说清楚了prototype,如果有理解错误的地方欢迎讨论指正。

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