最关健的二点:
**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,如果有理解错误的地方欢迎讨论指正。