2016-01-20 2 views
1

Здравствуйте, я знаю, что прототип определен один раз и является общим для всех экземпляров объектов, но каждый привязан к контексту созданного нового экземпляра. Я также знаю, что он сохраняет память в сравнении с методом, определенным с this внутри конструктора:Расход памяти классов статических методов Javascript

function Person(name) { 

    this.name = name; 

    // each instance will have it's own talk method 
    // so 500 * person instances = 500 * this.talk in memory 
    this.talk = function(str) { 
     console.log(this.name,"said",str); 
    }; 

} 

// 500 * person instances = 1 instance of talk2 in memory 
Person.prototype.talk2 = function(str) { 

    console.log(this.name,"said",str); 

}; 

Однако я не уверен, что статические методы и потребление памяти.

// 500 * person instances = x * talk3 in memory ? 
Person.talk3 = function(str) { 

    // code 

}; 

Являются ли они прототипами или нет?

+0

* "... но каждый привязан к контексту созданного нового экземпляра" * Ум, на самом деле, нет. Объект связан с прототипом, а не наоборот. –

+0

«Связывание» устанавливается * во время разговора * в Javascript, а не при создании экземпляра. До тех пор этот метод является всего лишь свойством объекта (прототипа), который разделяет все экземпляры. – deceze

+0

Да, я мог бы выразить свои мысли не так, как я сказал, что ты сказал – Syd

ответ

2

Неважно, сколько экземпляров Person вы создаете, есть только одна функция Person.talk3.


Side Примечание: Ваш комментарий о talk и talk2 являются правильными с точки зрения того, сколько функция объектов созданы. Современный механизм JavaScript вполне может повторно использовать код от talk в каждом из 500 объектов функций, созданных для него (что может быть актуальным, если есть много кода), но это деталь реализации/оптимизации.

+0

Это действительно интересно, я хочу, чтобы все двигатели сделали это ... – Syd

+0

@Syd: Я не уверен, что все современные не делают этого, когда разумно/полезно это сделать. В наши дни даже механизм JavaScript от Microsoft довольно хорош. :-) –

+0

Yeap вещь развилась :) – Syd

1

Они похожи только на прототипы в том смысле, что они выделены один раз. Кроме того, они являются не поделились или предоставлены на экземпляры каким-либо образом.

Кроме того, при вызове «статический» метод, например Person.talk3, будет иметь функцию Person как объект контекста («this»). Если вы не ссылаетесь на this в статическом методе, то Person.talk3 будет точно такой же, как регулярная функция, например. function personTalk() {...}.

+0

Точно то, что мне было нужно, просто и просто, спасибо – Syd

0
var p = new Person; 
p.talk3(); // TypeError 

talk3 не существует на экземпляре Person. Он существует только как свойство функции-конструктора, один раз.

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