сброс конструктора javascript: что это? - PullRequest
6 голосов
/ 11 апреля 2010

Я наткнулся на этот слайд: http://www.slideshare.net/stoyan/javascript-patterns#postComment

на стр. 35:

Опция 5 + супер + сброс конструктора

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

Я не понимаю. Кто-нибудь может объяснить, для чего последняя строка?

    C.prototype.constructor = C;  // WHY ???

Спасибо

Ответы [ 2 ]

11 голосов
/ 11 апреля 2010

Это дает объяснение http://phrogz.net/JS/Classes/OOPinJS2.html

В частности

Cat.prototype = new Mammal();        // Here's where the inheritance occurs 
Cat.prototype.constructor=Cat;       // Otherwise instances of Cat would have a constructor of Mammal 
0 голосов
/ 22 апреля 2019

Примечание: я полагаю, что этот сброс больше не нужен, если используется № 2 из следующих параметров:

Я полагаю, что вы можете использовать эти опции для наследования:

* 1. сделать через Object.create (в настоящее время я вижу этот синтаксис чаще):

Cat.prototype = Object.create(Mammal.prototype);//before this line of code has ran (where you can assume the Cat function is defined), the Cat.prototype was empty with a .prototype that correctly pointed to Cat... now it got overridden with Mammal's prototype inherited here which points to Mammal's constructor... need to reset on next line
Cat.prototype.constructor = Cat; //Since when prototype copied its constructor needs to get re-set/changed to the child constructor

* 2. через setPrototypeOf

Object.setPrototypeOf(Cat.prototype, Mammal.prototype); 
//don't need to reset Cat.prototype.constructor in this case; 'seems smarter'

* 3. через новый; Не думаю, что этот способ рекомендуется больше (хотя именно так я и научился устанавливать наследование много лет назад). Я полагаю, что читать настройку прототипа таким способом с помощью 'new ParentClass ()' больше не рекомендуется, так как он будет копировать свойства, которые не нужны в прототипе, я считаю (свойства, которые вы обычно устанавливаете в экземпляре с супер ( constructorParams) или ParentClass.call (this, constructorParams) в конструкторе / функции Cat, поэтому они должны быть общими для всех экземпляров через прототип).

Cat.prototype = new Mammal();
Cat.prototype.constructor=Cat;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...