2012-03-25 2 views
1

Это простой вопрос. В любом случае. Я предпочитаю, чтобы мой первый пример, но я не знаю, если делать это таким образом, вызывает больше памяти будет выделена, чем во втором примере, так как мы называем «новыми» на объекте ....javascript: отдельная функция для методов или встроенных в объект?

Пример 1

var post = function(){ 
    var self = this; 
    self.div = $('<div></div>'); 
    self.color = function(color){ 
    this.div.css({background:color}); 
    } 
} 

var p = new post(); 
p.color("#FFF"); 

Пример 2

var post = function(){ 
    self = this; 
    self.div = $('<div></div>'); 
} 

var color = function(p, color){ 
    p.div.css({background:color}); 
} 

var p = new post(); 
color(p, "#FFF"); 

Так, в первом примере, функция цвета я считаю, будет получать воссозданы каждый новый пост называется. Что делать, если у меня есть 100 new post(); звонков. Является менее эффективным, чем в примере 2, где функция определяется только один раз?

Имеет ли смысл то, что я прошу?

ответ

7

Да, в примере 1 будет отдельный экземпляр функции «цвет» для каждого экземпляра объекта «post», тогда как в примере 2 будет только один экземпляр функции. Очевидно, что если вы планируете чтобы иметь большое количество экземпляров объекта post, тогда вы используете больше памяти, чем вам нужно.

В JavaScript типичный (или прототип!) Способ решения этой проблемы с использованием лучших частей ваших двух примеров выглядит следующим образом (обратите внимание, что я использую «Post» с капиталом «P», за соглашение из функций конструктора, которые предназначены для использования с оператором new):

function Post() { 
    this.div = $('<div></div>'); 
} 

Post.prototype.color = function(color) { 
    this.div.css({background:color}); 
} 

var p = new Post(); 
p.color("#FFF"); 

при поиске собственности на объект (например, «p.color» в наших примерах), если свойство не определено непосредственно на экземпляр затем он рассматривается как атрибут «prototype» функции, которая построила объект (например, «Post.prototype.color»). Это также означает, что вы можете определить методы экземпляра в прототипе и переопределить их, назначив новые функции для имен свойств индивидуального экземпляра, если хотите.

Таким образом, мы по-прежнему получаем хороший объектно-ориентированный синтаксис вызова «p.color(...)» и преимущества только одного экземпляра метода функции, который используется всеми экземплярами «Post».

+1

Это так прототипно из вас. Хорошее объяснение и решение, +1. – bernie

+0

Как появился атрибут «prototype» в «Post»? Почему нам не нужно что-то вроде Post.prototype = {}; прежде чем мы сможем его использовать? (никто этого не делает, мне просто интересно, как это работает) –

+1

@ Danny Milosavljevic: http://es5.github.com/#x13.2, step 18. – pimvdb

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