首页 > 试题广场 >

请问以下 JS 代码最终输出的结果是() function

[单选题]
请问以下 JS 代码最终输出的结果是()
function func1() {};
function func2() {};
func1.prototype = func2.prototype = {};
const son = new func1();
console.log(son instanceof func1, son instanceof func2);
  • true、true
  • true、false
  • false、flase
  • false、true
**关键点:`instanceof` 检查的是“构造函数 prototype 指向的对象是否出现在实例的原型链上”,而不是检查构造函数本身。** ```js function func1() {} function func2() {} func1.prototype = func2.prototype = {}; // ① const son = new func1(); // ② console.log(son instanceof func1, son instanceof func2); ``` ### ① 共享同一个 prototype 对象 - 表达式从右向左求值,先创建一个新空对象 `{}`。 - 把这个对象同时赋给 `func2.prototype` 和 `func1.prototype`。 > 此时两者 **指向完全相同的对象引用**。 ### ② `new func1()` 做了什么 `new` 过程本质上是: 1. 创建空对象 `son`。 2. 把 `son.[[Prototype]]` 指向 `func1.prototype`(也就是上面那个共享的空对象)。 3. 执行构造函数体(这里为空)。 4. 返回 `son`。 ### ③ `instanceof` 判断流程 `X instanceof Y` 会沿着 `X` 的原型链向上走,看 **是否能找到 `Y.prototype` 指向的对象**。 | 判断 | 查找的目标 | 结果 | |------|-----------|------| | `son instanceof func1` | `func1.prototype` → 那个共享对象 | ✔ 在第一层就找到 | | `son instanceof func2` | `func2.prototype` → 同一个共享对象 | ✔ 也在第一层就找到 | 因为二者的 `prototype` 引用是同一个对象,而这个对象正好就是 `son` 的原型,所以两个判断都返回 `true`。 > **最终输出:`true true`,对应选项 A。** --- #### 补充小结 1. 给多个构造函数手动赋同一个 `prototype` 对象时,它们在“`instanceof` 关系”上会连通。 2. `prototype.constructor` 会被覆盖成 `Object`,但这不影响 `instanceof` 判定。
发表于 2025-04-28 12:06:55 回复(0)