You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

给函数prototype赋值原始类型时,内部会发生什么?

给函数prototype赋值原始类型时的内部机制

先看这段代码:

let ill = function() { this.a = 'legal'; };
ill.prototype = 1234;

let ins = new ill();

console.log(Object.getPrototypeOf(ins) === ill.prototype);

打印结果为 false。

内部发生的具体逻辑

  1. 函数prototype属性的赋值本身是有效的:你可以给函数的prototype赋任何值,包括原始类型(数字、字符串、布尔值等),这段代码里ill.prototype确实会被设置为1234,后续直接访问ill.prototype也能拿到这个值。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:54:39