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,如果有理解错误的地方欢迎讨论指正。

     
 

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值