Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Есть ли разница? (https://javascript.ru/forum/misc/4840-est-li-raznica.html)

JSprog 24.08.2009 18:30

Как ты меня бесишь Влад. Думаешь я об этом не знаю? Я использую такую терминологию чтобы было понятней. И сам иди делай что-нибудь. Вот уж кто точно быдлокодер

B~Vladi 24.08.2009 18:30

Цитата:

Сообщение от Dmitry A. Soshnikov
А если бы было с new?

Тогда fnc использовалась как конструктор и this указывал бы на вновь созданный объект оператором new. Соответственно z присваевалось бы ему. Опять же - всё зависит от того откуда эту функцию вызывать.

Dmitry A. Soshnikov 24.08.2009 18:41

JSprog, B~Vladi, выделяйте цитату на которую отвечаете, так удобней.

Цитата:

Сообщение от JSprog
Связь с конструктором так как дочерние объекты не копируют свойство а тольок "читают" его

А если конструктор удалить? Или присвоить null? Объект сможет обратиться к этой свойству в .prototype? Вроде как, да.

function A() {}
A.prototype.z = 10;
var a = new A();
A.prototype = null;
a.constructor = null;
A = null;
alert(a.z); // 10 ?


Почему так? Ведь конструктор и .prototype уже null. И объект "а" уже потерял связь с ним - .constructor тоже null.

Цитата:

Сообщение от B~Vladi
В JavaScript нет классов

А там другая терминология какая-то? Расскажи подробней.

Цитата:

Сообщение от B~Vladi
JSprog, харош уже, давай что-нибудь уже делай...

Цитата:

Сообщение от JSprog
Как ты меня бесишь Влад. Думаешь я об этом не знаю? Я использую такую терминологию чтобы было понятней. И сам иди делай что-нибудь. Вот уж кто точно быдлокодер


B~Vladi, JSprog, парни, ну мы ж, вроде, договорились. Забейте, нас щас не это интересует (меня больше ;) вы так хорошо рассказываете, а спускаетесь до выяснения отношений. Всё, забили).

JSprog 24.08.2009 18:45

Цитата:

Сообщение от Dmitry A. Soshnikov
А если конструктор удалить? Или присвоить null? Объект сможет обратиться к этой свойству в .prototype? Вроде как, да.

Ну дак а прототип останетса

Dmitry A. Soshnikov 24.08.2009 18:49

Цитата:

Сообщение от JSprog
Ну дак а прототип останетса

Каким образом?

JSprog 24.08.2009 18:51

Ошибся
Метод экземпляра может быть вызван для любого экземпляра класса, но это не значит, что каждый объект содержит собственную копию метода, как в случае свойства экземпляра.
Вместо этого каждый метод экземпляра совместно используется всеми экземплярами класса
В JavaScript мы определяем метод экземпляра класса путем присваивания функции свойству объекта прототипа в
конструкторе.
Это касаетса только методов
Цитата:

Сообщение от Dmitry A. Soshnikov
вы так хорошо рассказываете,

Плюсик бы поставил тогда=)

Dmitry A. Soshnikov 24.08.2009 19:06

Цитата:

Сообщение от JSprog
Ошибся

В чём?

Цитата:

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

А, т.е. в этом случае:

function A(x) {
  this.x = x;
  this.getX = funciton () {
    return this.x;
  };
}

var a = new A(10);
var b = new A(20);

alert(a.getX()); // 10
alert(b.getX()); // 20


Объекты "а" и "b" будут иметь разное свойство "x", но одинаковый для обоих метод .getX? Или я не так понял?

Цитата:

Сообщение от JSprog
В JavaScript мы определяем метод экземпляра класса путем присваивания функции свойству объекта прототипа в
конструкторе.
Это касаетса только методов

Или ты имел в виду, когда метод описан в прототипе, только тогда он расшаривается между всеми экземплярами? А почему касается только методов? В чём тогда отличие от свойств? Свойство же тоже можно разместить в прототипе.

Цитата:

Сообщение от JSprog
Плюсик бы поставил тогда=)

А я ещё не полностью разобрался ;)

В частности, не было объяснено, каким образом объект общается с прототипом, если A.prototype уже null? И, если, всё-таки, конструктор и .prototype могут быть null, то получается, это:

Цитата:

Сообщение от JSprog
Связь с конструктором так как дочерние объекты не копируют свойство а тольок "читают" его

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

JSprog 24.08.2009 19:12

Цитата:

Сообщение от Dmitry A. Soshnikov
В чём?

В том что свойства из прототипа просто читаютса
Цитата:

Сообщение от Dmitry A. Soshnikov
Объекты "а" и "b" будут иметь разное свойство "x", но одинаковый для обоих метод .getX?

Именно
Цитата:

Сообщение от Dmitry A. Soshnikov
А почему касается только методов?

Думаю так заложенно на уровне синатксиса языка. Ведь зачем копировать метода на всех? Это отнимает много памяти да и редко методы менять приходитса в экземплярах.
Цитата:

Сообщение от Dmitry A. Soshnikov
В чём тогда отличие от свойств?

Методы это тоже свойства которые содержат функцию.
Цитата:

Сообщение от Dmitry A. Soshnikov
Связь с конструктором так как дочерние объекты не копируют свойство а тольок "читают" его

Верно только для методов

Dmitry A. Soshnikov 24.08.2009 19:24

JSprog, подожди, тут я уже начал путаться.

Цитата:

Сообщение от JSprog
В том что свойства из прототипа просто читаютса

А что ещё можно с ними делать? Вероятно, не только читать из прототипа, но и записывать туда. И свойства и методы, да?

Цитата:

Сообщение от JSprog
Именно

А почему тогда в данном случае .hasOwnProperty выдаёт true?

function A(x) {
  this.x = x;
  this.getX = funciton () {
    return this.x;
  };
}
 
var a = new A(10);
var b = new A(20);

// ну тут понятно
alert(a.hasOwnProperty('x')); // true
alert(b.hasOwnProperty('x')); // true

// а здесь почему, если ты говоришь, что
// метод getX - один на оба объекта
alert(a.hasOwnProperty('getX')); // true
alert(b.hasOwnProperty('getX')); // true


Цитата:

Сообщение от JSprog
Ведь зачем копировать метода на всех? Это отнимает много памяти да и редко методы менять приходитса в экземплярах.

Логично, но почему тогда .hasOwnProperty('getX') для обоих объектов выдало true? Есть ли какой-нибудь способ, чтобы метод .getX действительно был один на оба объекта? Сейчас получается, что оба из них имеют две разные функции, но выполняющие одно и тоже. Реально, не очень выгодно по ресурсам.

Цитата:

Сообщение от JSprog
Методы это тоже свойства которые содержат функцию.

Ну я понимаю, т.е. и свойства и методы можно хранить в прототипе и тогда эти свойства и методы будут одними и теми же на все экземпляры, так? Или не так?

Цитата:

Сообщение от JSprog
Верно только для методов

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

JSprog 24.08.2009 19:34

Цитата:

Сообщение от Dmitry A. Soshnikov
И свойства

и всё...
Цитата:

Сообщение от Dmitry A. Soshnikov
. Почему свойства так обделены?

Свойста часто изменяюса и меньше весят
Цитата:

Сообщение от Dmitry A. Soshnikov
но почему тогда .hasOwnProperty('getX') для обоих объектов выдало true

У меня твой код вообще не работает
FireBug выдаёт ошибку на 4 строке
this.prototype.getX = funciton () {\n


Часовой пояс GMT +3, время: 18:36.