javascript - 重定义构造函数原型(prototype)后,对象构造函数指向原始构造函数而不是prototype.constructor

标签 javascript oop constructor prototype

例如:

function F() {};
F.prototype = {
    test: function() { console.log('test'); }
};

console.log(F.prototype.constructor); // [Function: Object]

F.prototype = 'string';

var o = new F();
console.log(F.prototype.constructor); // [Function: String]
console.log(F.prototype);             // string
console.log(o.constructor);           // [Function: Object]

o.test();  // Can't work

在上面的代码中,初始构造函数是F(),即F.prototype.constructor。但随后我将 F.prototype 重置为 'string'。还有我的问题:

  1. F.prototype重置为'string'后,为什么F.prototype.constructor变成了[Function: String]。换句话说,它决定了 F.prototype.constructor?
  2. 我知道新对象将继承prototype 对象的属性,constructor 属性也是如此。但是为什么对象p的构造函数是原来的构造函数[Function: Object],而不是[Function: String]呢?

提前致谢。

最佳答案

constructor 字段没什么特别的,它和其他字段一样。

#1 的答案:

F.prototype = "string";
console.log(F.prototype.constructor); // function String

记录 function String 因为它和 一样

console.log("string".constructor); // function String

#2 的答案:

每个对象内部 __proto__ 字段必须是 typeof x === "object"。在原型(prototype)链的末尾总是有一个 null 值(通常是 Object.prototype.__proto__ 一个),并且不允许循环。您将原始 string 分配给构造函数 prototype 字段 (typeof F.prototype === "string"),它不能用作 __proto__,所以 new 运算符只是返回使用默认原型(prototype)构造对象,即 Object.prototype

关于javascript - 重定义构造函数原型(prototype)后,对象构造函数指向原始构造函数而不是prototype.constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44435889/

相关文章:

javascript - 如何从express\nodeJS中的post请求获取数据并在提交后将用户重定向到html文件

javascript - 如何在 PhpStorm 中将 `.js` 火设置为 Node

javascript - 使用 TypeScript super()

c++ - const 对象未初始化的编译器投诉

java - 在 Swing 中按下按钮之前阻止流程继续进行

javascript - toFixed() 替换函数

javascript - 在 JavaScript 中打印字节数组的十六进制或十进制值

java - 如何更新 if block 中的实例变量?

c++ - 如何通过编译错误找到 C++ 复制构造函数的使用位置?

c++ - 在另一个类的构造函数中创建 n 个对象的最佳方法?