@Worddoc
Frontend explorer

Почему функция общего прототипа не работает в разных конструкторах (ОСТОРОЖНО, НОВИЧОК!)?

Здравствуйте. Добрался до ООП и прототипов. У функции First и Second прототип - Object и он общий для всех функций. Так вот почему, метод, записанный в этот прототип, не работает в разных функциях-конструкторах? Буду очень благодарен за ответ!

function First() {
	return;
}

function Second() {
	return;
}

console.log(First.prototype) // Object {}
console.log(Second.prototype) // Object {}

First.prototype.func = function() {
	return 'Метод прототипа!'
}

var a = new First();
var b = new Second();

console.log(a.func()) // Метод прототипа!
console.log(b.func()) // b.func is not a function

console.log(a.func()) // a.func is not a function
console.log(b.func()) // b.func is not a function
  • Вопрос задан
  • 649 просмотров
Решения вопроса 1
AMar4enko
@AMar4enko
Прототипы First и Second это два разных объекта, хоть и выглядят одинаково "Object {}"
Поэтому метод, добавленный в прототип First, доступен в его экземпляре a и недоступен в экземпляре b Second.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
danielnewman
@danielnewman
Front-end
Не очень хороший способ, но кто мешает расширить прототип родителя? Вот таким греховным образом числа в моем приложении обретают формат:

/*    Метод format конструктора Number >>>
 *    Расширение прототипа
 *
 *    Метод позволяет задавать число знаков после запятой и
 *    Вводить знак валют до или после значения.
 *
 *    Пример работы:    (123456789.12345).format(2, 2, '—', '=')
 *        возвращает:    1—23—45—67—89=12
 *
 *    Все экземпляры Number наследуются от Number.prototype.
 */
Number.prototype.format = function (n, x, s, c) {
    var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\D' : '$') + ')';
    var num = this.toFixed(Math.max(0, ~~n));

    return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), '$&' + (s || ','));
};


И так вот используются:

Number(condPriceMin).format(0, 3, '&nbsp', '.') + '<i class="fa fa-rub"></i>';
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы