powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Поясните по поводу одной вещи в Javascript
25 сообщений из 30, страница 1 из 2
Поясните по поводу одной вещи в Javascript
    #38079999
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Наткнулся на такой пример, который мне пока не до конца понятен:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function Foo() {
}

Foo.prototype.method = function (a, b, c) {
    console.log(this, a, b, c);
};

// Создаём несвязанную версию "method"
// Она принимает параметры: this, arg1, arg2...argN
Foo.method = function () {

    console.log("[");
    // Результат: Foo.prototype.method.call(this, arg1, arg2... argN)
    Function.call.apply(Foo.prototype.method, arguments);
    console.log("]");
};

Foo.method(this, 1,2,3); // ????



Вроде понятно, что у всех объектов есть некий базовый прототип, как в примере Foo.prototype, у которого можно добавлять поля и функции. Тоесть новые функции хранятся в объекте-прототипе.

с new Foo() - мне понятно.

Но мне не понятно, где хранится функция Foo.method? И на каком этапе этот объект создается?

Правильно ли я рассуждаю, если скажу что - Foo - это некий статический объект, который может хранить любые ключ-значения, в частности стандартное поле prototype?
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080003
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще вопрос вдогонку - что значит из комментария - "Создаём несвязанную версию "method""?
Не связанную с чем?
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080005
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageПравильно ли я рассуждаю, если скажу что - Foo - это некий статический объект, который может хранить любые ключ-значения, в частности стандартное поле prototype?да.
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080011
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageНе связанную с чем?не связанную с объектом, который будет создан как new Foo() .
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080035
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный МечunicornmirageПравильно ли я рассуждаю, если скажу что - Foo - это некий статический объект, который может хранить любые ключ-значения, в частности стандартное поле prototype?да.

В таком случае:

Foo.method

и

Foo.prototype.method

это совершенно разные методы, просто называются одинаково.
И разница в том, что

Foo.method - доступен для статического объекта Foo .

А Foo.prototype.method - доступен только из экземпляра new Foo()
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080041
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да.
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080168
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за ответы.
Еще возникло два вопроса по поводу примера в первом посте:

когда мы создаем новый экземпляр через new Foo(), то в нем создаются копии всех полей из prototype.

1) так как в примере новый экземпляр через new Foo() не был создан , то строка:

Function.call.apply(Foo.prototype.method, arguments);

фактически вызывает статическую функцию прототипа Foo.prototype?


2) зачем при создании экземпляра через new - копировать функции? С полями данных - логично, так как они определяют состояние нового объекта. А вот функции зачем копировать?
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080181
Фотография Малыхин Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторзачем при создании экземпляра через new - копировать функции?Никто их не копирует prototype это указатель на другой эоемент
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080187
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Малыхин Сергейавторзачем при создании экземпляра через new - копировать функции?Никто их не копирует prototype это указатель на другой эоемент

Тогда как объяснить такой результат:
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080189
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Малыхин Сергейавторзачем при создании экземпляра через new - копировать функции?Никто их не копирует prototype это указатель на другой эоемент

Тогда как объяснить такой результат:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function Foo(id) {
    this.id = id;
}
Foo.prototype = {
    id: "NOID"
};

console.log(Foo.prototype.id);
console.log(new Foo("one").id);
console.log(new Foo("two").id);



На экран выведет:
авторNOID
one
two
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080198
Фотография Малыхин Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Элементов id может быть сколько угодно в цепочке прототипов
сначало id ищется у текущего элемента если не найдено то ищется у предка через указатель prototype
В первом случае явно у предка запрашивается id
в последующих id берется у текущего элемента
new вызывает конструктор (если это можно назвать конструктором) который создает id в новом элементе
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080208
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что смущает?
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080223
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonА что смущает?

хочу понять, при создании нового экземпляра через new, какая логическая организация полей-объектов и полей-функций в памяти, относительно нового созданного объекта.

Малыхин Сергей Элементов id может быть сколько угодно в цепочке прототипов
сначало id ищется у текущего элемента если не найдено то ищется у предка через указатель prototype
new вызывает конструктор (если это можно назвать конструктором) который создает id в новом элементе


Тоесть в данном случае id - это уже совсем другой id, не связанный никак с полем Foo.prototype.id?

Тоесть получается, если мы в конструкторе Foo не будем задавать this.id = ..., то у экземпляра new Foo() поле id будет ссылаться на Foo.prototype.id
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080236
Фотография Малыхин Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конструкция "new Foo('x')" создаст/вернет новый элемент
т.е.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function Foo(id) {
    this.id = id;
}
Foo.prototype = {
    id: "NOID"
};

// var a = new Foo('x'); // создаст элемент a у которого будет свойство id т.е. a.id = x

// или лучше разложить приведенный пример тот же самый пример только с сохранением в переменные

var a,b,c ;
a = Foo.prototype.id;
b = new Foo("one");
c = new Foo("two");

console.log(a);
console.log(b.id); 
console.log(c.id);
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080248
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirage,

у функции Foo есть свойство prototype.
Foo.prototype - некий объект, со своими полями.
new Foo() создает новый объект, которому можно присваивать некие свои поля (this.id = id; это и делает).
однако в объекте, созданном через new Foo(), есть скрытое поле-ссылка (назовем ее "__proto__"), которая ссылается на тот же объект, на который ссылается Foo.prototype (на момент вызова new Foo())

Код: javascript
1.
var obj = new Foo();


так вот obj.__proto__ ссылается на этот прототипный объект.

когда ты вызываешь obj.myFunc(), метод myFunc сначала ищется непосредственно в составе объекта obj.
если не находится, ищется в составе obj.__proto__
у прототипа так же может быть свой прототип, и если в obj.__proto__ не нашлось, будет искаться в obj.__proto__.__proto__
и т.д. по цепочке прототипов.


Поразмыслив над этим, ты поймешь, почему конструкция
Код: javascript
1.
2.
3.
Foo.prototype.myFunc2 = function (a, b, c) {
   ...
};

"добавляет" метод myFunc2 во все объекты, уже созданные как new Foo(), или создаваемые в дальнейшем как new Foo().
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080250
Фотография Малыхин Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТоесть получается, если мы в конструкторе Foo не будем задавать this.id = ..., то у экземпляра new Foo() поле id будет ссылаться на Foo.prototype.id Что мешает попробовать ?
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080251
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageТоесть получается, если мы в конструкторе Foo не будем задавать this.id = ..., то у экземпляра new Foo() поле id будет ссылаться на Foo.prototype.idда.
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38080255
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь разобрался в этом вопросе.
всем большое спасибо за помощь! :)
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38100635
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный МечunicornmirageТоесть получается, если мы в конструкторе Foo не будем задавать this.id = ..., то у экземпляра new Foo() поле id будет ссылаться на Foo.prototype.idда.
Похоже оно будет иметь такое же значение как Foo.prototype.id, но вот ссылаться на него оно не будет, иначе это привело бы к тому, что изменение id в одном экземпляре отражалось бы в других экземплярах Foo.
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38100647
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LexxxxxЯростный Мечпропущено...
да.
Похоже оно будет иметь такое же значение как Foo.prototype.id, но вот ссылаться на него оно не будет, иначе это привело бы к тому, что изменение id в одном экземпляре отражалось бы в других экземплярах Foo.Чё? Книжек перечитали?
1. Свойство ищется у объекта;
2. Если нет, то ищется у объекта, на который ссылается __proto__;
3. Если нет, то п. 2 повторяется для объекта из п. 2
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38100658
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA1. Свойство ищется у объекта;
2. Если нет, то ищется у объекта, на который ссылается __proto__;...

Предположим есть два экземпляра объекта, item1 и item2, у которых в их прототипе есть свойство protoProperty, со значением 18.
Мы пишем код типа item1.protoProperty = 5;
skyANA1. Свойство ищется у объекта;
2. Если нет, то ищется у объекта, на который ссылается __proto__;... и находится "у объекта, на который ссылается __proto__" и присваивается ему 5. Правильно?!

Далее мы пишем var e = item 2 .protoProperty;
skyANA1. Свойство ищется у объекта;
2. Если нет, то ищется у объекта, на который ссылается __proto__;... и находится "у объекта, на который ссылается __proto__" и чему будет равно var e? Если следовать Вашей логике то 5. Я правильно понял?
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38100662
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LexxxxxskyANA1. Свойство ищется у объекта;
2. Если нет, то ищется у объекта, на который ссылается __proto__;...

Предположим есть два экземпляра объекта, item1 и item2, у которых в их прототипе есть свойство protoProperty, со значением 18.
Мы пишем код типа item1.protoProperty = 5;
После этого свойство protoProperty появится у объекта item1

LexxxxxskyANA1. Свойство ищется у объекта;
2. Если нет, то ищется у объекта, на который ссылается __proto__;... и находится "у объекта, на который ссылается __proto__" и присваивается ему 5. Правильно?!

Далее мы пишем var e = item 2 .protoProperty;
skyANA1. Свойство ищется у объекта;
2. Если нет, то ищется у объекта, на который ссылается __proto__;... и находится "у объекта, на который ссылается __proto__" и чему будет равно var e? Если следовать Вашей логике то 5. Я правильно понял?Речь шла о "если мы в конструкторе Foo не будем задавать this.id". Так понятнее?
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38100679
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA...После этого свойство protoProperty появится у объекта item1 ...
Т.е. в момент первой записи значения item1.protoProperty = 5 где-то внутри него будет выделена память для хранения значения (5) и все последующие операции чтения/записи будут производится с этой памятью вплоть до того момента (если он вообще наступит), когда будет выполнен код delete item1.protoProperty, после чего item1.protoProperty будет опять ссылаться на Object.prototype.protoProperty. Так?
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38100698
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx, если нет свойства, то оно не может куда-то ссылаться

Ещё раз перечитайте отсюда: 13635132
...
Рейтинг: 0 / 0
Поясните по поводу одной вещи в Javascript
    #38100702
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANALexxxxx, если нет свойства, то оно не может куда-то ссылаться 13635132
Код: javascript
1.
2.
3.
4.
function MyObject() { }
Object.prototype.protoProperty = '18';
var item1 = new MyObject();
var e = item1.protoProperty;



Разве е не будет = 18, хотя свойства item1.protoProperty еще нет (согласно Вашим словам оно появится только тогда, когда в него запишут чего нибудь)? Значит вместо item1.protoProperty произошло обращение куда-то еще (Object.prototype.protoProperty)?

skyANAЕщё раз перечитайте отсюда: 13635132
У меня возникает ощущение, что мы об одном и том же разговариваем, только немного разными словами.
Так в какой момент времени во вселенной появится свойство item1.protoProperty?
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Поясните по поводу одной вещи в Javascript
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]