在重新定义构造函数的原型之后,对象构造函数指向原始构造函数而不是prototype.constructor

时间:2017-06-08 12:32:23

标签: 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]
  3. 提前致谢。

1 个答案:

答案 0 :(得分:3)

构造函数字段没什么特别的,它和任何其他字段一样。

回答#1

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

记录function String,因为它与

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

回答#2

内部__proto__字段的每个对象都必须为typeof x === "object"。在原型链的末尾,始终存在null值(通常是Object.prototype.__proto__值),并且不允许循环。您为构造函数string字段(prototype)分配了一个原语typeof F.prototype === "string",该字段不能用作__proto__,因此new运算符只会回退到构造具有默认原型的对象,即Object.prototype