Например:
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'
. И есть мои вопросы:
F.prototype
в 'string'
, почему F.prototype.constructor
становится [Function: String]
. Другими словами, которые определяют значение F.prototype.constructor
?prototype
, поэтому свойство constructor
. Но почему конструктор объекта p
был исходным конструктором [Function: Object]
, а не [Function: String]
?Заранее спасибо.
Поле конструктора ничего особенного не имеет, как и любое другое поле.
Ответ для # 1:
F.prototype = "string";
console.log(F.prototype.constructor); // function String
logs function String
потому что она такая же, как
console.log("string".constructor); // function String
Ответ для # 2:
Каждое внутреннее поле __proto__
должно быть typeof x === "object"
. В конце цепи прототипа всегда есть null
значение (обычно это Object.prototype.__proto__
one), и нет разрешенных циклов. Вы назначили примитивную string
в поле prototype
конструкторов (typeof F.prototype === "string"
), который не может использоваться как __proto__
, поэтому new
оператор просто возвращается, чтобы построить объект с прототипом по умолчанию, который является Object.prototype
.
[Function: Object]
?