2016-11-03 2 views
1

Как можно делегировать метод (delegate prototype) сохранить ресурсы памяти?Прототип делегата в JavaScript

Поскольку делегирование метода сохраняет память, является ли это одной из причин, почему делегирование/наследование прототипа предпочтительнее классического наследования?

+1

рассматривает даже ES3 разрешено внутренней функции рециркуляции, экономия RAM прототипов сильно преувеличены. это все еще не плохой рисунок, но это не так драматично экономия, как наивно ожидает. – dandavis

+1

@dandavis Можете ли вы предоставить ссылку об этом? Я хотел бы больше узнать об этом. –

+0

@ScottMarcus: он широко не покрыт. см. ПРИМЕЧАНИЕ в 13.1.2 [спецификации es3] (http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999. pdf), говоря о повторном использовании объектов SCOPE и объектов. я провел некоторое тестирование давно, и измерения, казалось, подтвердили частичную нехватку сбережений между фабрикой и конструктором. – dandavis

ответ

1

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

function A() { 
    this.hello = function() { 
    console.log('A new function is created in memory every time'); 
    console.log('an instance of A is created'); 
    }; 
} 

function B() { } 
B.prototype.hello = function() { 
    console.log('Only one function is created and every instance'); 
    console.log('of B shares this one function'); 
}; 

А почему это лучше использовать метод делегирования с помощью прототипа, чем классического наследования в JavaScript, это потому, что JavaScript на самом деле не поддерживает классическое наследство. Все, что вы видите, что имитирует классическое наследование, - это то, что: мимика.

1

Это не то, что прототипное наследование предпочтительнее классического наследования, просто JavaScript не является компилируемым языком, поэтому ему нужен другой подход.

Применяя методы (действия) к прототипу, они сохраняются один раз для всех экземпляров, которые используют этот прототип. Если вы должны были прикрепить их к самим экземплярам, ​​каждый экземпляр займет больше памяти, чтобы сохранить поведение, отличное от любого другого экземпляра.

Поэтому, как правило, свойства, которые хранят примитивами (строки, числа, булевы) создаются как свойства экземпляра, потому что их значения могут отличаться от экземпляра к экземпляру (т.е. p1.name = «Скотт», p2. name = "Mary"). Но свойства, которые хранят функции, имитируют методы (поведение) и поведение для возврата значения (например, имя), не изменяются от экземпляра к экземпляру. Поэтому методы, как правило, добавляются к прототипу.

Например:

function Person(name){ 
 
    
 
     // This is an "instance property". Every time an instance 
 
     // of Person is created, that instance will store a name property 
 
     // in the object's memory. This type of property needs to be set up 
 
     // like this because each Person can/will have a different name. 
 
     this.name = name; 
 
    } 
 
    
 
    // This method always does the same thing, regardless of 
 
    // what instance it's dealing with, so it's better to store 
 
    // it just one time on the object that all Person instances 
 
    // will inherit from: 
 
    Person.prototype.getName = function(){ return this.name; } 
 

 

 
    // Both of these Person instances inherit from the same (one) Person 
 
    // prototype. 
 
    var p1 = new Person("Scott"); 
 
    var p2 = new Person("Mary"); 
 
    
 
    // So while each instance reserves space to store a name: 
 
    console.log(p1.name); // "Scott" 
 
    console.log(p2.name); // "Mary" 
 
    console.log(p1.hasOwnProperty("name")); // true 
 
    console.log(p2.hasOwnProperty("name")); // true 
 
    console.log(p1.hasOwnProperty("getName")); // false 
 
    console.log(p2.hasOwnProperty("getName")); // false 
 
    
 
    // Neither of those instances are storing the function for getName(). 
 
    // That is being stored just once in Person.prototype and p1 and p2 
 
    // are inheriting that behavior: 
 
    console.log(p1.getName()); // "Scott" 
 
    console.log(p2.getName()); // "Mary" 
 
    console.log(p1.hasOwnProperty("getName")); // false 
 
    console.log(p2.hasOwnProperty("getName")); // false 
 
    console.log(p1.__proto__.hasOwnProperty("getName")); // true

+0

В классическом наследовании (не в JavaScript), делегирование метода отсутствует. Он имеет подклассы и ссылки на суперкласс. Какой из них более эффективен с использованием делегирования методов или использования классического наследования? – Yogesh

+0

@Yogesh На этот вопрос нет ответа. Классическое наследование работает в предварительно скомпилированных средах, JavaScript не предварительно скомпилирован. Яблоки и апельсины. В JavaScript у вас нет выбора - - Классы не существуют. В классических языках (например, Java, C# и т. Д.) У вас нет выбора, прототипов не существует. –

+0

Если бы я хотел выбрать тип наследования (классический или прототип) для языка для реализации, какие факторы следует учитывать. это предварительно скомпилированная среда или что-то еще? – Yogesh

Смежные вопросы