LINUX.ORG.RU

Расширение через prototype

 ,


0

1

Часто встречается так:

function Foo () {
    this.value = 42;
}

Foo.prototype = {
    method: function () {}
};
Непонятно, зачем делают так, если этот прототип больше ничем не используется, а не так:
function Foo () {
    this.value = 42;
    this.method = function () {};
}

★★

Последнее исправление: CYB3R (всего исправлений: 1)

Один метод вс метод на каждый инстанс. Нельзя наследоваться в будущем если захочется.

zz ★★★★
()

Потому что так ты просто при каждом создании объекта создаешь новое свойство, соответственно выделяя и новую память. Изменить их все разом потом тоже нельзя.

А ещё правильней кстати

Foo.prototype.method = ...

Kalashnikov ★★★
()

Второй вариант тоже лучше не делать, так как ты перезаписываешь стандартный прототип, в котором есть свойство constructor. Правильные пацаны делают так:

function Foo(value) {
  this.value = value;
}

Foo.prototype.getValue = function getValue() {
  return this.value;
}

Foo.prototype.anotherMethod = function anotherMethod(param) {
  return (this.value + param) / 0;
}

var foo = new Foo(10);
console.log(foo.constructor); // [Function: Foo]

Дублирование названия метода в объявлении функции может быть полезно стектрейсов при дебаге.

anonymous
()
Ответ на: комментарий от anonymous

может быть полезно стектрейсов при дебаге, если ты пользуешься рантаймом который писали школьники.

FTFY

zz ★★★★
()

Как уже было сказано, так ты создаешь объекты каждый раз (в первую очередь функции), это и хорошо, и плохо.

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

Прототип - это общие свойства для группы объектов (с этим прототипом), если надо - то надо, если нет - то нет.

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 1)

Понятно. Спасибо всем за ответы!

metrokto ★★
() автор топика
Ответ на: комментарий от trashymichael

Как именно обойтись с этим свойством уже вопрос личных предпочтений. Я придерживаюсь мнения, что не следует подменять дефолтный объект-прототип новым.

anonymous
()
Ответ на: комментарий от anonymous

я не вижу причин писал слово prototype тысячу лишних раз (если чно не настаиваю ;)

trashymichael ★★★
()
Последнее исправление: trashymichael (всего исправлений: 1)
Ответ на: комментарий от Kalashnikov

Да и во многих фреймворках есть extend или подобное, чтобы не перезаписывать prototype, но писать в более удобном (для некоторых) стиле.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.