В JavaScript у нас есть два способа сделать "класс" и предоставить ему публичные функции.
Способ 1:
function MyClass() {
var privateInstanceVariable = 'foo';
this.myFunc = function() { alert(privateInstanceVariable ); }
}
Способ 2:
function MyClass() { }
MyClass.prototype.myFunc = function() {
alert("I can't use private instance variables. :(");
}
Я читал много раз, когда люди говорили, что использование метода 2 более эффективно, поскольку все экземпляры используют одну и ту же копию функции, а не каждый, получая свои собственные. Однако определение функций через прототип имеет огромный недостаток - это делает невозможным наличие частных переменных экземпляра.
Хотя теоретически использование метода 1 дает каждому экземпляру объекта свою собственную копию функции (и, следовательно, использует больше памяти, не говоря уже о времени, требуемом для распределения), - это то, что на самом деле происходит на практике? Похоже, что оптимизационные веб-браузеры могут легко сделать, это распознать этот чрезвычайно распространенный шаблон и фактически иметь все экземпляры ссылки на объекты той же копии функций, определенных с помощью этих "функций конструктора". Тогда он может предоставить экземпляр только своей копии функции, если он явно изменен позже.
Любое понимание - или, даже лучше, реальный мировой опыт - о различиях в производительности между этими двумя, было бы чрезвычайно полезно.