Почему в Javascript свойство constructor указывает на самый базовый конструктор в цепочке прототипов?

#javascript

#javascript

Вопрос:

Мне любопытно узнать об этом дизайне Javascript и, возможно, о каких-либо причинах такой архитектуры или шаблонах проектирования, которые можно использовать, чтобы воспользоваться этим преимуществом.

constructor Свойство объекта всегда является ссылкой на функцию, которая создала этот объект, правильно?

Однако, возьмите этот код:

   function base()
  {
     this.SayHi = function ()
     {
        window.alert('Hi');
     };
  }

  function subclass()
  {
     this.SayBye = function ()
     {
        window.alert('Bye');
     };
  }

  subclass.prototype = new base();

  var s = new subclass();
  s.SayHi();
  s.SayBye();
  window.alert(s.constructor);
  

В последней строке будет отображен конструктор для base , даже если мы знаем, что subclass был вызван для создания объекта (иначе SayBye это не сработало бы).

Одним из возможных обходных путей было бы просто сделать:

 subclass.prototype.constructor = subclass;
  

Возможно, более лаконичный способ задать мой вопрос заключается в том, почему s.constructor равно subclass.prototype.constructor , а не subclass.constructor нет, поскольку s это подкласс instanceof. Спасибо!

Ответ №1:

Все объекты наследуют constructor свойство от своего прототипа.

Источник.

Именно так это и работает. Вы часто видите людей, явно устанавливающих для constructor свойства значение, которое кажется им более интуитивно понятным.

Комментарии:

1. 1 за ссылку на Javascript Garden, это было интересное чтение! Разрешил несколько заблуждений, которые были у меня в течение многих лет.

2. Это утверждение сбивает с толку, поскольку его легко можно истолковать как обозначающий общедоступный прототип объекта, тогда как наследование происходит от внутренних proptotypes. Требуется еще одно редактирование MDN.

3. @RobG: Спасибо, я отражу новый текст (когда вы его измените).

4. Похоже, ответ на мой вопрос таков : «Это работает таким образом, потому что так и должно работать» 🙂