Конструктор объекта указывает на исходный конструктор, а не на prototype.constructor после переопределения прототипа функции конструктора.

1

Например:

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]?

Заранее спасибо.

Теги:
oop
constructor
prototype

1 ответ

3
Лучший ответ

Поле конструктора ничего особенного не имеет, как и любое другое поле.

Ответ для # 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.

  • 0
    Хороший ответ! Спасибо!
  • 0
    И я хочу знать, есть ли способ напечатать исходный код конструктора, а не только его тип [Function: Object] ?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню