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 12:48

Есть ли разница?
 
Есть ли между этими выражениями разница?
function func(arguments) {this.z=arguments}
func(100)

и
function func(arguments){}
func.z=100

Мб смешно но пока писал сам разобрался=)
Поправите если что.
Предполагается что func будет конструктором
и this.z создаёт копию z для каждого экземпляра объекта
а func.prototype.z создаёт единственную копию z для всех дочерних объектов
и func.z не видна дочерним объектам

Octane 24.08.2009 16:34

Как ты замучал бессмысленными темами и флудом.

B~Vladi 24.08.2009 16:36

JSprog, ты так и не понял ничего?!

JSprog 24.08.2009 16:37

Вообще-то эта старая тема
Что я виноватт что ломал над этим голову пару часов а когда написал понял в чём дело?
больше не буду=):no:

Dmitry A. Soshnikov 24.08.2009 16:44

Цитата:

Сообщение от B~Vladi
ты так и не понял ничего?!

B~Vladi, а ты понял? Расскажи мне.

B~Vladi 24.08.2009 16:57

Цитата:

Сообщение от Dmitry A. Soshnikov
B~Vladi, а ты понял? Расскажи мне.

Цитата:

Сообщение от B~Vladi
Ты, прежде чем постить, сам пытался выяснить?!

Если да - поделись наблюдениями, если нет - сначала поковыряй сам.
Если не хочешь ковырятся - пости все свои вопросы в одной теме!

Что мне надо понять?:)

Dmitry A. Soshnikov 24.08.2009 17:13

Цитата:

Сообщение от B~Vladi
Что мне надо понять?

Ну, если нуб (допустим, я) тебя спросит, в чём разница между:

Цитата:

Сообщение от JSprog
function func(arguments) {this.z=arguments}
func(100)
и
function func(arguments){}
func.z=100

объяснишь?

JSprog 24.08.2009 17:16

Цитата:

Сообщение от Dmitry A. Soshnikov
Ну, если нуб (допустим, я)

:lol:
Йа не нуп

alexKniaz 24.08.2009 17:17

Думаю надо так.
function func(arguments){
var res=new Object();
res.z=arguments;
return res;
}

//Пример
var r=func(100);
alert(r);
alert(r.z);

JSprog 24.08.2009 17:18

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. Во первых
Во вторых что значит как надо?

Dmitry A. Soshnikov 24.08.2009 17:22

Цитата:

Сообщение от JSprog
Йа не нуп

Я абстрактно спрашивал B~Vladi, просто использовал твою цитату ;)

JSprog 24.08.2009 17:25

Я середнячок)

B~Vladi 24.08.2009 17:34

Цитата:

Сообщение от Dmitry A. Soshnikov
объяснишь?

В данном случае нет... Этот вопрос не стоит отдельной темы:)

Или вы считаете, что я не знаю?;)

JSprog 24.08.2009 17:36

Конечно знаешь...
...теперь...
...я же написал о результатах в первом посте

B~Vladi 24.08.2009 17:38

Цитата:

Сообщение от JSprog
...теперь...

:D спасибо, а то я чуть не спалился...

Dmitry A. Soshnikov 24.08.2009 17:53

Цитата:

Сообщение от B~Vladi
Или вы считаете, что я не знаю?

А что, не знать - постыдно? Я просто спросил, мне интересно, как бы ты объяснил, в чём там разница?

B~Vladi 24.08.2009 17:57

Нет никакого желания, но если вы будете настаивать...:)

JSprog 24.08.2009 17:59

Мы настаиваем

B~Vladi 24.08.2009 18:04

Сравнивать такие конструкции... По-моему у тебя каша в голове... Я это разгребать не буду...

JSprog 24.08.2009 18:05

ха-ха
теперь ты точно спалися
На самом деле можно объяснить одним предложением

B~Vladi 24.08.2009 18:06

Цитата:

Сообщение от JSprog
тепреь ты точно спалися

Достал ты меня, немо... Иди проспись...

JSprog 24.08.2009 18:07

Типо умный такой? Реально думаешь что я немо?
Иди сам проспись
А твои глупые отмазки сразу видно

Dmitry A. Soshnikov 24.08.2009 18:10

Цитата:

Сообщение от JSprog
На самом деле можно объяснить одним предложением

JSprog, хорошо, ты тогда расскажи.

JSprog, B~Vladi, забейте отношения выяснять, нам же главное разобраться, есть ли разница, и, если есть, то в чём, не так ли?

JSprog 24.08.2009 18:12

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

Dmitry A. Soshnikov 24.08.2009 18:18

Цитата:

Сообщение от JSprog
function func(arguments) {this.z=arguments}

Цитата:

Сообщение от JSprog
Первый вариант создаёт копию свойства для каждого экземпляра объекта то есть свойство экземпляра

Вроде понятно, т.е. func - это конструктор, который создаёт новый объект и this внутри этого конструктора указывает на новый объект, да? И "this.z" - создаёт свойство "z" в этом созданном объекте и присваивает ему переданное значение "arguments", так?

Цитата:

Сообщение от JSprog
function func(arguments){} func.z=100

Цитата:

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

В смысле, все порождённые экземлпяры будут иметь доступ к func.z? А как обратиться из экзепляра к ней, если они связаны?

B~Vladi 24.08.2009 18:19

Цитата:

Сообщение от Dmitry A. Soshnikov
забейте отношения выяснять

Я как раз и решил это сделать:)
Цитата:

Сообщение от Dmitry A. Soshnikov
есть ли разница, и, если есть, то в чём, не так ли?

Именно.

Ок, что бы не тыкать друг на друга - расскажу я.

function func(arguments) {this.z=arguments}

Здесь this указывает на объект, откуда был вызван конструктор(функция), в данном слечае - это window:
func(100);

Поэтому свойство z мы устанавливаем для window.
function func(arguments){}
func.z=100


Здесь есть объект typeof=='function', и этому (только) объекту мы устанавливаем свойство z.

Если бы мы записали
fnc.prototype.z

Свойство z имели бы все объекты типа function.

Так пойдёт?!

JSprog 24.08.2009 18:21

Цитата:

Сообщение от Dmitry A. Soshnikov
В смысле, все порождённые экземлпяры будут иметь доступ к func.z? А как обратиться из экзепляра к ней, если они связаны?

это свойство, связанное с самим классом, а не с каждым экземпляром этого класса
А вернее func.prototype.z
func.z скорее всего вообще недоступно дочерним объектам
<script>
function yyy(){}
yyy.z=100
xxx=new yyy
alert(xxx.z)
</script>

Тому потверждение

Dmitry A. Soshnikov 24.08.2009 18:27

Цитата:

Сообщение от JSprog
это свойство, связанное с самим классом, а не с каждым экземпляром этого класса

Ага, точно. Т.е. обратиться можно только через сам конструктор, либо через ссылку .constructor у объекта (если её не перезаписали).

function func(arguments){}
func.z = 10;
var a = new func(10);
alert(a.constructor.z); // 10
alert(func.z); // 10


Цитата:

Сообщение от JSprog
А вернее func.prototype.z

А в данном случае "z" как связана с порождёнными объектами? Или здесь тоже с конструктором связь?

Цитата:

Сообщение от B~Vladi
Здесь this указывает на объект, откуда был вызван конструктор(функция), в данном слечае - это window:

Да, действительно. В примере же "func(100);" не указано new. А если бы было с new?

B~Vladi 24.08.2009 18:28

В JavaScript нет классов. JSprog, харош уже, давай что-нибудь уже делай...

JSprog 24.08.2009 18:29

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

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, время: 20:33.