js原型链
发布于 3 年前 作者 Even0311 1592 次浏览 来自 问答

最近看js原型链时候感觉很困惑啊,读了mdn关于prototype和继承的部分。 以下是我的理解和问题希望各位大神赐教

首先追溯到Object,他就是一个对象,对象的意思也就是一个属性集。 他有一个属性叫做prototype,当有新的类继承(基于原型其实没有继承,按照我的理解这个更像一个装饰者模式,也就是子类和父类是有一个的关系,而不是是一个的关系)Object的时候,这个子类会有一个构造函数用来定义自有属性,和一个prototype属性,也就是一个指针,指向父类的prototype对象。 也就是说在定义子类构造函数的时候我们其实是做了这样一个事

function a(prop){
	this.prop=prop
}

声明了自有变量prop, 隐式声明了一个指针,叫做prototype, 指向Object.prototype. 当我们每一次初始化 a的实例的时候, 会隐式赋予该实例一个__proto__属性,他是一个指针,指向 a.prototype来达到父类方法共享的目的,这也就是为什么当我们修改 a.prototype内的方法的时候所有实例都会相应改变。 问题如下,

  1. 如果有 class b extends a{} 那也就是说b的prototype指向了a的prototype,也指向了object的prototye, 是这样吗?
  2. 如果我修改了 b.prototype.xxx = ‘foo’, a.prototype是否会有xxx属性

感谢各位大神的赐教。

2 回复

关于js原型链,第一个点在于实例化的时候发生了什么, function a(name){ this.name=name } const instanceA=new a(‘aa’); 这一段代码,实例化了一个a的对象,叫做instanceA, 在内存中开辟了一块空间存放常量 name:'aa’和一个隐式声明的指针,叫做__proto__,指向 a.prototype. 下面会探讨a.prototype的来源和原型链如何一直向上查找。

上面的函数声明 等价于 class a extends Object{ constructor(name){ this.name=name; } // 下面两个赋值操作是js隐式完成的,我把它们写出来只是想清楚发生了什么,以及是不是这样的。 this.prototype= deepClone(Object.prototype) this.prototype.proto=Object.prototype } 也就是说在继承的时候,子类会深拷贝父类的prototype作为自己的prototype,并且添加一个__proto__指针指向父类prototype的地址,这个指针就是为了原型链追溯,深拷贝父类prototype可以保证在修改子类prototype的时候不会修改父类的prototype。

以上是我的理解,不知道是否正确,希望赐教。

我懂了,子类的prototype是一个空对象加一个指针,叫__proto__,指向父类prototype, 又可以向上追溯,又可以保护父类prototype不被子类污染

回到顶部