Все объекты в javascript наследуют от Object, и потому имеют свойство prototype
.
Как правило, свойство prototype
используется для предоставления базового набора функциональных возможностей классу объектов. Новые экземпляры объекта "наследуют" поведение прототипа, присвоенного этому объекту.
Предположим, что нам требуется добавить в объект Array метод, который возвращает значение наибольшего элемента массива. Для этого объявляется функция, которая добавляется к объекту Array.prototype
, а затем используется.
Пример: Добавляем метод объектам Array
function array_max( ){
var i, max = this[0];
for (i = 1; i < this.length; i++) {
if (max < this[i])
max = this[i];
}
return max;
}
Array.prototype.max = array_max;
// а теперь создадим новый массив
// и запустим новый метод
var x = [ 1, 2, 3, 4, 5, 6]
var y = x.max( );
В obj.prototype как получить не все экземпляры этого класса, а конкретный экземпляр, используемый юзером сейчас?
this указывает на конкретный экземпляр.
По-моему в код опечатка или ошибка
скобок в этом случае быть не должно, т.к. Array.prototype.max должна быть функцией, а не ее результатом.
Чтобы было понятнее, можно сделать и так:
Ребята, читайте спецификацию, а не такие вот "руководства":
"... объекты могут создаваться различными способами, в том числе – посредством буквенного обозначения или с помощью конструкторов, которые создают объекты и выполняют код, инициализирующий их полностью или частично путем присвоения их свойствам начальных значений. Каждый конструктор является функцией, которая обладает свойством “prototype”, используемым для реализации прототипного наследования и разделяемых свойств".
У объекта Javascript (не путать с функцией Object()) нет свойства prototype! Есть неявное свойство, которое ссылается на constructor.prototype. Таким образом, prototype можно задать только для конструктора объекта, но не для самого объекта.
Полностью согласен.
А свойство __proto__ доступно во всех браузерах или нет?
Если сильно надо, то можно им воспользоваться ведь...
Очень дельный комментарий. Тоже обратил внимание на не совсем корректное описание. Спасибо.
Видимо я не до конца понял работу свойства prototype, подскажите пожалуйста где ошибка. Вот мой код:
var ivan = {
im: "Иван",
}
ivan.prototype.say_name = function(name)
{
this.name = name;
alert("Привет, меня зовут "+this.name);
}
ivan.say_name(ivan.im);
Вопрос закрыт - разобрался сам. - Просто прочитал статью выше и понял ошибку: свойство prototype можно задавать только конструктору объекта, а не конкретному объекту. Поэтому и выбивало ошибку.
Скажи пожалуйста, в чем разница
AND
В первом случае прототип в любой момент можно изменить, и эти изменения будут отражены даже в уже созданных объектах. Кроме того, так требуется меньше памяти.
Во втором способе такого преимущества нет. Но, поскольку метод getA размещен внутри функции foo (что, вообще говоря, не обязательно), ему доступны объявленные в foo переменные
почему не работает такая конструкция?
Потому что "this" в "in_array" указывает на "fn", а не на "a".
Как часто пишут:
"В отличие от многих языков, this никак не привязано к объекту, а обозначает просто объект, вызвавший функцию."
В данной ситуации объект 'a' имеет свойство fn.
Свойство fn является самостоятельным объектом с методом in_array(el).
Поэтому this указывает именно объект fn.