Зачем использовать object.prototype.constructor в ООП javascript? - PullRequest
21 голосов
/ 31 января 2012

Я недавно начал читать на ООП 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 с Function на A.

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

Какой смысл?

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

Ответы [ 5 ]

12 голосов
/ 31 января 2012

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

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

4 голосов
/ 31 января 2012

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

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

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

2 голосов
/ 31 января 2012

Этот код, если его часто используют в классическом шаблоне наследования JS (код взят из JavaScript Patterns Стояна Стефанова):

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

для назначения правого конструктора дочернему классу.

Inваш случай ничего не сделал, так как A.prototype.constructor === A до назначения.

1 голос
/ 02 июля 2015

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

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

..

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

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

Однако, поскольку свойство конструктора возвращает ссылку на функцию Object, которая создала прототип экземпляра, необходимо сбросить свойство конструктора при назначении нового прототипа функции 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

1 голос
/ 27 октября 2013

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

https://stackoverflow.com/a/19616652/207661

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...