最关健的二点:
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 =Object.prototype;
Number.proto = Function.protoype; Function.protoype = Object.prototype;
内置类型也是和自定义类型一样的
好像真的就是二句话就说清楚了prototype,如果有理解错误的地方欢迎讨论指正。
标签:Function,理角,proto,对象,Object,ts,js,类型,prototype From: https://www.cnblogs.com/abc126655/p/18263177