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