我们先创建一个类
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函数