JavaScript 对于类 构造函数 constructor ,__proto__,prototype 之间关系的深度解析

我们先创建一个类

class xxx {
  constructor(){
    this.x = 'x'
    this.y = 'y'
  }
  say1(){
    console.log(1)
  }
}

给这个类的prototype添加一个方法

xxx.prototype.say2 = () => {
  console.log(2)
}

实例化这个类

let a = new xxx()
let b = new xxx()

在控制台分别去打印它们

很明显,在JavaScript中类是一个函数,是一个function,通过它实例化(构造)的是一个object,并且之前在类中定义的方法,好像在实例中看不见了。但是实例确确实实能够调用到。为什么会这样,以下是我推测的结构

通过代码class xxx {}会在内存(堆栈?)里面创建两个板块,一个是私有板块,每一个实例都是独立的,一个板块是公有的,每一个实例都可以访问到
在代码中class xxx 之后 直接输出xxx,xxx指向的私有板块的代码,xxx是一个函数 typeof 为 function
xxx通过.prototype 来访问公有板块,并且有读写权

实例化的a可以通过_proto_来访问公有板块,并且可以修改
 

let cc = new Date()
let b = new Date()
b.getDate()  // 24
b.__proto__.getDate = () => {console.log(5)}
b.getDate()  //5
cc.getDate() //5


并且,系统在实例调用公共板块方法的时候,会默认通过_proto_去查找公共板块的方法比如
比如 a.say1  会被解析成 a._proto_.say1

// 2020 4.24更新
我犯了个很愚蠢的问题,__proto__,并不是只可读的,因为代码上的疏忽,我看错了,已更正

我突然发现少讲了个constructor

1.constructor的指向为构造其的代码,注意是代码,

let b = new Date()
b.constructor  //  ƒ Date() { [native code] }

2.因为是代码所以通过 constructor 给构造函数添加的方法是在函数体上,实例是访问不到的!!!
 

    let c = new Date()
    c.constructor.say1 = () => {console.log(1)}
    c.say1()  //error
    Date.say1() // 1

3.constructor是挂载到_proto__上面的
 

 let c = new Date()   
 c.__proto__.constructor  //Date函数

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值