2013-05-25 3 views
0

Недавно я начал изучать Javascript, поскольку я отправляюсь из мира Java. Я получил эту книгу под названием JavaScript The Definitive guide.. Сейчас я немного запутался в прототипах и наследовании. Я хочу знать, в чем разница между установкой функции в свойство объекта и прототипом функций. Из книги, например:Prototypes and Inheritance

function Rectangle(w, h) { 
this.width = w; 
this.height = h; 
this.area = function() { return this.width * this.height; } 
} 

С этой новой версии конструктора, вы можете написать код так:

// How big is a sheet of U.S. Letter paper in square inches? 
var r = new Rectangle(8.5, 11); 
var a = r.area(); 

Это решение работает лучше, но по-прежнему не является оптимальным (почему). Каждый созданный прямоугольник будет иметь три свойства (да, и что?). Свойства ширины и высоты могут быть разными для каждого прямоугольника , но область каждого отдельного объекта Rectangle всегда относится к той же функции (кто-то может ее изменить, конечно, но вы обычно намереваетесь методы объекта, который будет постоянным). Неэффективно использовать регулярные свойства для методов , предназначенных для совместного использования всеми объектами того же класса (ПОЧЕМУ В чем проблема?) (То есть все объекты , созданные с тем же конструктором).

+1

Почему вниз голосов? – Jason

+0

В этом случае я должен определить область как прототип: Rectangle.prototype.area = function() ... Таким образом, все Recangle используют одну и ту же функцию, поскольку область вычисления всегда одинакова для Rectangle, это хорошо. когда с или с изменением высоты, зона вызова гарантирует, что всегда возвращает правильное значение. Вы можете установить область при создании объекта, но тогда вам нужно будет создать геттеры и настройки для обеих областей и высоты, чтобы перечислить область при изменении любого из них. – HMR

+0

Если вы хотите понять, как работает прототип, и как создавать экземпляры объектов из функций, чем пытаться запустить этот код: http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 Я предлагаю использовать Firefox с плагином Firebug или Chrome, вы можете копировать и вставлять код в консоль и запускать его без перезагрузки страниц каждый раз. – HMR

ответ

5

объекта Rectangle всегда относится к тем же функциям

Это неправильно. Каждый объект rectangle будет иметь свою собственную копию функции, назначенной для свойства area.

Хотя, если вы использовали определение на основе прототипа, у вас будет одна функция, совместно используемая во всех экземплярах.

Так от производительности и памяти точки потребления зрения лучше определить его как

Rectangle.prototype.area = function() { 
    return this.width * this.height; 
}; 
+0

Это очень хороший ответ. Существуют ли другие различия? – Adelin

+0

@Adio: лично я не думаю, что есть другие различия, о которых я бы позаботился. – zerkms

+0

Повторное установление и повторное определение области затронет все экземпляры Rectangle, даже те, которые были созданы до переопределения функции области. Вы не можете изменить значение прототипа в экземпляре: b = new Rectangle(); b.area = 55; Это добавит свойство area в значение b со значением 55, но не влияет на область других экземпляров Rectangle (они получают его из Rectangle). Это сбивает с толку, поэтому я снова посылаю вам ссылку на эксперимент: http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 – HMR