2017-01-23 8 views
-1

Моя цель состоит в том, чтобы добавить свойства к (этому) контексте главного функции от прототипа другой функции SubmainКак использовать call() с прототипами?

function Main() { 
    Submain.call(this); 
    //from here I want to be able to use this.a, this.b, this.c, this.d 
    //...Main code... 
} 

function Submain() { 
    //this works fine 
    this.a = 1; 
    this.b = 2; 

    //this does not work because of the context 
    this.doThis(); 
} 

Submain.prototype.doThis = function() { 
    this.c = 3; 
    this.d = 4; 
} 

Итак, как использовать Submain прототип для этой цели ?

+0

Я вижу, к чему вы клоните. Я не знаю, на какое решение вы надеялись. Объект, который вы предоставили, не имеет этого метода. Его можно было бы вручную помещать внутри 'Main' или' Main.prototype', но это выглядит не очень хорошо. Есть ли определенная причина, по которой вы упорядочили свой код таким образом? –

+0

Вы можете добавить метод doThing вместо использования прототипов. Но это плохой выбор (влияние производительности на многие объекты). Лучшим выбором может быть копирование прототипа Main из прототипа Submain [см. Здесь] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain), чтобы лучше понять, как работает цепь прототипирования – allevo

+0

На самом деле, мой главный прототип огромен, поэтому я хотел бы перерезать его в несколько файлов, чтобы быть более модульными. Я могу использовать sub = new Submain(), а затем использовать sub.c, sub.d, но я спросил себя, есть ли другое решение. – zbeyens

ответ

0

Часть, которую вам не хватает, если я правильно понимаю, устанавливает прототип конструктора Main. Это как один, как правило, делают это:

Object.setPrototypeOf(Main.prototype, Submain.prototype); 

Тогда вы могли бы вызывать doThis на объекты, созданные с new Main из конструктора или из любого другого метода:

var main = new Main(); 
console.log(main.c, main.d); // prints 3, 4 
+0

Мое общее мнение о том, что 'setPrototypeOf' несет огромные и сложные проблемы с производительностью даже в тривиальных приложениях? – furkle

+0

@furkle Это городская легенда от до ES6 раз, но по-прежнему популяризируется MDN. –

+0

Действительно? Есть ли какие-либо документы по этому поводу? Потому что это было бы очень полезно для меня, если так; десериализация объектов и повторное добавление методов прототипа - это боль, но язык на MDN ... пугающий. – furkle

0

Я должен был объединить Submain прототип к Главная прототип.

Это можно сделать с помощью Object.assign (ES6).

function Main() {} 

Main.prototype = Object.assign(Submain.prototype, { 
    doThat: function() { 
     Submain.call(this); 
     //from here I can use this.a, this.b, this.c, this.d 
    }, 
    //...Main functions... 
}); 

function Submain() { 
    this.a = 1; 
    this.b = 2; 

    //this works now 
    this.doThis(); 
} 

Submain.prototype.doThis = function() { 
    this.c = 3; 
    this.d = 4; 
}