JavaScript Range2类的prototype是什么?对应Python的等效概念是什么?
问题解答
1. JavaScript中Range2类的prototype是什么
JS的class是构造函数的语法糖,你定义的Range2类本身是一个构造函数,它自带的prototype是一个预定义的对象,你在class块内写的所有实例方法(除了constructor以外的方法)都会自动挂载到这个对象上,所以最终Range2.prototype包含3个所有实例共享的方法:
toString()- 迭代器生成器方法
*[Symbol.iterator]() includes(x)
所有通过new Range2()创建的实例(比如你代码里的r),内部的隐式原型__proto__都会指向Range2.prototype,这也是为什么所有实例不需要单独复制这些方法,就能直接调用的原因。
你可以直接打印验证:
console.log(Range2.prototype) // 输出的对象上就包含上述三个方法,以及自动继承的Object原型方法
2. 对应Python的近似等效概念
JS的prototype核心作用是存储类的所有实例共享的方法,避免每个实例单独拷贝方法占用内存,和这个功能最接近的就是Python的类对象本身的实例方法集合:
你在Python的class块内定义的所有普通实例方法(第一个参数为self的方法),都会存储在Python类对象的属性字典里,不会在每个实例初始化的时候复制一份,实例调用方法时如果自己的属性里找不到,就会自动去所属类的方法集合里查找,和JS的原型链查找逻辑完全对应。
举个修正参数名后的Python示例(Python中from是关键字不能直接用作参数名):
class Range2: def __init__(self, from_num, to_num): self.from_num = from_num self.to_num = to_num # 下面的方法都存在Range2类对象上,所有实例共享 def includes(self, x): return self.from_num <= x <= self.to_num
这里Range2类对象存储的includes等实例方法,就等效于JS里Range2.prototype上挂载的方法。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

