Подтвердить что ты не робот

Зачем использовать object.prototype.constructor в OOP javascript?

Недавно я начал читать на OOP javascript, и одна вещь, о которой, по-видимому, пропустят авторы, - это когда объявлен объект A, и вдруг я вижу "A.prototype.constructor = A; Например,

var A = function(){}; // This is the constructor of "A"
A.prototype.constructor = A;
A.prototype.value = 1;
A.prototype.test = function() { alert(this.value); }
var a = new A(); // create an instance of A
alert(a.value);  // => 1

Итак, я запускаю команду в firebug "var A = function() {};" а затем "A.Constructor", который показывает, что это функция. Я это понимаю. Я запускаю код "A.prototype.constructor = A;" и я думал, что это изменяет конструктор A от функции до A.

Свойство конструктора A было изменено правильно? Вместо этого, когда я запускаю "A.constructor", он дает мне функцию().

Какой смысл?

Я также вижу A.constructor.prototype.constructor.prototype.. что происходит?

4b9b3361

Ответ 1

Если A наследует B с помощью A.prototype = new B();, вам нужно reset свойство конструктора для класса A с помощью A.prototype.constructor=A;, в противном случае экземпляры A будут иметь конструктор B.

В вашем случае A.prototype.constructor === A вернет true, поэтому A.prototype.constructor = A ничего не сделал.

Ответ 2

Вы можете быстро проверить, что это дополнительное назначение ничего не делает:

var A = function() {};
A.prototype.constructor === A; // true -- why assign then?

Сброс свойства конструктора имеет смысл только в том случае, если вы назначили новый объект-прототип классу, перезаписывая исходный конструктор:

var A = function() {};
A.prototype = protoObject; // some object with members that you'd like to inherit
A.prototype.constructor = A; // reset constructor

В вашем случае автор может слепо делать это как хорошую практику, даже в тех случаях, когда это не необходимо.

Ответ 3

Этот код, если он часто используется в классическом шаблоне наследования JS (код из шаблонов JavaScript от Stoyan Stefanov):

function inherit(C, P) { 
    var F = function () {}; 
    F.prototype = P.prototype; 
    C.prototype = new F(); 
    C.uber = P.prototype; 
    C.prototype.constructor = C; 
} 

чтобы назначить правильный конструктор дочернему классу.

В вашем случае это ничего не делало, поскольку A.prototype.constructor === A перед назначением.

Ответ 4

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

fooobar.com/questions/246386/...

TL; DR: конструктор не является собственным свойством экземпляра. Поэтому, чтобы все выглядело согласованным, интерпретатор JavaScript должен установить для prototype.constructor свою функцию. Эта функция может использоваться в функциях, которые работают в основном на разных типах объектов.

Ответ 5

Согласно MDN, все объекты наследуют свойство конструктора от своего прототипа:

Example 1:
var o = {};
o.constructor === Object; // true

..

Example2:
function Tree() {  
}    
var theTree = new Tree();
console.log(theTree.constructor === Tree ); // true

Во время выполнения это не имеет никакого значения в зависимости от значения свойства конструктора.

Однако, поскольку свойство constructor возвращает ссылку на функцию Object, которая создала прототип экземпляра, нужно reset свойство конструктора, когда они назначают новый прототип функции Object.

var Forest = function() {};
Forest.prototype = theTree;  
console.log(new Forest().constructor === Tree ); // true
Forest.prototype.constructor = Forest;  
console.log(new Forest().constructor === Forest ); // true

https://jsfiddle.net/j1ub9sap/

Подробнее: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor