Javascript.RU

prototype

Прототип объекта

Описание, примеры

Все объекты в 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( );

Автор: Questioner, дата: 7 марта, 2012 - 13:47
#permalink

В obj.prototype как получить не все экземпляры этого класса, а конкретный экземпляр, используемый юзером сейчас?


Автор: Гость (не зарегистрирован), дата: 18 мая, 2012 - 15:35
#permalink

this указывает на конкретный экземпляр.


Автор: Гость (не зарегистрирован), дата: 12 июня, 2012 - 19:15
#permalink

По-моему в код опечатка или ошибка

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<strong>()</strong>;

// а теперь создадим новый массив 
// и запустим новый метод
var x = [ 1, 2, 3, 4, 5, 6]
var y = x.max( );

Автор: Гость (не зарегистрирован), дата: 20 июня, 2012 - 12:56
#permalink

скобок в этом случае быть не должно, т.к. Array.prototype.max должна быть функцией, а не ее результатом.

Чтобы было понятнее, можно сделать и так:

Array.prototype.max = function ( ){
   var i, max = this[0];
   for (i = 1; i < this.length; i++) {
   if (max < this[i])
   max = this[i];
   }
   return max;
}

Автор: Гость (не зарегистрирован), дата: 17 декабря, 2012 - 17:25
#permalink

Ребята, читайте спецификацию, а не такие вот "руководства":
"... объекты могут создаваться различными способами, в том числе – посредством буквенного обозначения или с помощью конструкторов, которые создают объекты и выполняют код, инициализирующий их полностью или частично путем присвоения их свойствам начальных значений. Каждый конструктор является функцией, которая обладает свойством “prototype”, используемым для реализации прототипного наследования и разделяемых свойств".
У объекта Javascript (не путать с функцией Object()) нет свойства prototype! Есть неявное свойство, которое ссылается на constructor.prototype. Таким образом, prototype можно задать только для конструктора объекта, но не для самого объекта.


Автор: grkov (не зарегистрирован), дата: 27 февраля, 2013 - 10:41
#permalink

Полностью согласен.
А свойство __proto__ доступно во всех браузерах или нет?
Если сильно надо, то можно им воспользоваться ведь...


Автор: Zalex, дата: 22 января, 2014 - 15:28
#permalink

Очень дельный комментарий. Тоже обратил внимание на не совсем корректное описание. Спасибо.


Автор: haos2100, дата: 1 марта, 2013 - 10:00
#permalink

Видимо я не до конца понял работу свойства prototype, подскажите пожалуйста где ошибка. Вот мой код:
var ivan = {
im: "Иван",
}

ivan.prototype.say_name = function(name)
{
this.name = name;
alert("Привет, меня зовут "+this.name);
}

ivan.say_name(ivan.im);


Автор: haos2100, дата: 1 марта, 2013 - 10:08
#permalink

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


Автор: isxaker (не зарегистрирован), дата: 18 июня, 2014 - 09:24
#permalink

Скажи пожалуйста, в чем разница

function foo(a){
   this.a = a;
}

a.prototype.getA = function(){return this.a;}

AND

function foo(a){
   this.a = a;
   this.getA = function(){return this.a;}
}

Автор: numberZero (не зарегистрирован), дата: 28 июня, 2014 - 18:50
#permalink

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

function foo(a){
   this.a = a;
}
foo.prototype.getA = function(){return this.a;}

var bar = new foo(17);
foo.prototype.cc = 187;
bar.a == 17; // true
bar.cc == 187; // true

Во втором способе такого преимущества нет. Но, поскольку метод getA размещен внутри функции foo (что, вообще говоря, не обязательно), ему доступны объявленные в foo переменные

function f(){return this.a * 3}
function foo(a){
   var x = a % 12;
   this.a = a;
   this.getA = function(){return this.a;};
   this.getX = function(){return x;};
   this.ff = f;
}
var bar = new foo(17);
bar.getA() == 17; // true
bar.getX() == 5; // true
bar.ff() == 51; // true

Автор: axmed2004, дата: 2 ноября, 2014 - 13:08
#permalink

почему не работает такая конструкция?

Array.prototype.fn={
	in_array:function(el){
		a=0
		for(i=0;i<this.length;i++){
			if(this[i]==el)
				a++
		}
		return a>0
	}
}

a=["a","b","c"]
document.write(a.fn.in_array("b"))

Автор: Гость (не зарегистрирован), дата: 13 ноября, 2014 - 20:28
#permalink

Потому что "this" в "in_array" указывает на "fn", а не на "a".

Array.prototype.fn={
	in_array:function(el){
		console.log(this); // Выведет объект "fn"
	}
}

a=["a","b","c"]
document.write(a.fn.in_array("b"))

Автор: Гость com (не зарегистрирован), дата: 6 мая, 2015 - 17:02
#permalink

Как часто пишут:
"В отличие от многих языков, this никак не привязано к объекту, а обозначает просто объект, вызвавший функцию."

В данной ситуации объект 'a' имеет свойство fn.
Свойство fn является самостоятельным объектом с методом in_array(el).
Поэтому this указывает именно объект fn.


Автор: Гость (не зарегистрирован), дата: 12 апреля, 2022 - 17:55
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 00:17
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 13:29
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 14:41
#permalink

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
11 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum