给函数prototype赋值原始类型时,内部会发生什么?
给函数prototype赋值原始类型时的内部机制
先看这段代码:
let ill = function() { this.a = 'legal'; }; ill.prototype = 1234; let ins = new ill(); console.log(Object.getPrototypeOf(ins) === ill.prototype);
打印结果为 false。
内部发生的具体逻辑
函数prototype属性的赋值本身是有效的:你可以给函数的
prototype赋任何值,包括原始类型(数字、字符串、布尔值等),这段代码里ill.prototype确实会被设置为1234,后续直接访问ill.prototype也能拿到这个值。new操作符的原型设置规则:当用
new调用构造函数创建实例时,步骤中会为新实例设置内部原型([[Prototype]],可通过Object.getPrototypeOf()访问),但这里有个关键限制:- 如果构造函数的
prototype是对象类型(包括null),实例的[[Prototype]]会直接指向这个对象; - 如果构造函数的
prototype是原始类型,这个值会被忽略,实例的[[Prototype]]会被设置为Object.prototype——这是所有普通JavaScript对象的默认原型。
- 如果构造函数的
回到示例代码:
ins的内部原型是Object.prototype,而ill.prototype是数字1234,两者完全不是一个东西,所以Object.getPrototypeOf(ins) === ill.prototype的结果是false。
本质原因是JavaScript的原型继承体系基于对象,原始类型无法承担原型的角色(无法挂载可继承的属性/方法),因此new操作符会在这种场景下自动 fallback 到默认的对象原型。
内容的提问来源于stack exchange,提问作者T.Worm
相关产品推荐
相关产品推荐

