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 19:37

Цитата:

Сообщение от Dmitry A. Soshnikov
};

Ошибка не в этом но вообще-то в конце составной инструкции точку с запятой не ставят

JSprog 24.08.2009 20:12

Все ущли завтро договорим=)

Dmitry A. Soshnikov 24.08.2009 20:33

Цитата:

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

Опечатался в слове "function", вот так правильно:

function A(x) {
  this.x = x;
  this.getX = function () {
    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
и всё...

Т.е. метод нельзя записать в прототип? Почему, что мешает? Не понял этот момент.

Цитата:

Сообщение от JSprog
Ошибка не в этом но вообще-то в конце составной инструкции точку с запятой не ставят

Ошибка была в опечатке слова function. А точка с запятой там нужна ;)

Цитата:

Сообщение от JSprog
Все ущли завтро договорим=)

Ок, может B~Vladi что-нибудь прояснит тогда.

JSprog 24.08.2009 20:35

Цитата:

Сообщение от Dmitry A. Soshnikov
Ошибка была в опечатке слова function. А точка с запятой там нужна

не нужна

Dmitry A. Soshnikov 24.08.2009 20:41

Цитата:

Сообщение от JSprog
не нужна

Нужна-нужна.

// так будет ошибка
var a = function () {} var b = 10;

// а так - правильно
var a = function () {}; var b = 10;

Вообще, точка с запятой нужна обязательно после некоторых инструкций, просто парсер сам вставляет точку с запятой в случае перевода строки. Если же перевода не будет (как в примере выше) - будет ошибка, поэтому точка с запятой там нужна.

JSprog 24.08.2009 20:43

Вы в свой код пробовали добавить?
alert(a.getX)

Dmitry A. Soshnikov 24.08.2009 20:47

Цитата:

Сообщение от JSprog
Вы в свой код пробовали добавить?
alert(a.getX)

Да, выдаёт, что это функция. Неверно?

А если добавить:

alert(a.getX === b.getX); // false

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

JSprog 24.08.2009 20:48

У меня с использованием
alert(a.getX)
просто выводитса код функции

JSprog 24.08.2009 20:49

<html>
<body>
 <script language="javascript" type="text/javascript">
function A(x) {
  this.x = x;
}
A.prototype.getX=function(){return 15}
 var a = new A(10);
var b = new A(20);
 // ну тут понятно
alert(a.hasOwnProperty('x')); // true
alert(b.hasOwnProperty('x')); // true
alert(a.isPrototypeOf('x'));//false
// а здесь почему, если ты говоришь, что
// метод getX - один на оба объекта
alert(a.hasOwnProperty('getX')); // false
alert(b.hasOwnProperty('getX')); // false
alert(a.isPrototypeOf('getX'));
alert(a.getX)
</script>
</body>
</html>

Dmitry A. Soshnikov 24.08.2009 20:50

Цитата:

Сообщение от JSprog
У меня с использованием
alert(a.getX)
просто выводитса код функции

А это срабатывает метод .toString, который есть у каждого объекта. Его можно перезаписать, но в случае функций, он выдаёт, код. Хотя, это зависит от реализаций.

JSprog 24.08.2009 20:53

И как сделать чтобы вывелся результат работы функции?

Dmitry A. Soshnikov 24.08.2009 20:54

Цитата:

Сообщение от JSprog
A.prototype.getX=function(){return 15}

Ну вот, а говоришь, что нельзя методы хранить в прототипе. Оказывается, можно. Более того, теперь:

alert(a.hasOwnProperty('getX')); // false
alert(b.hasOwnProperty('getX')); // false


и, что самое важное:

alert(a.getX === b.getX); // true. Теперь это один и тот же метод.


Я думаю, ты именно об этом говорил.

Цитата:

Сообщение от JSprog
alert(a.isPrototypeOf('x'));//false

Цитата:

Сообщение от JSprog
alert(a.isPrototypeOf('getX'));

Это не понятно, вероятно, имелось в виду:

A.prototype.isPrototypeOf(a); // true


Цитата:

Сообщение от JSprog
И как сделать чтобы вывелся результат работы функции?

Вызвать её, указав выражение вызова (Call-expression) - скобки:

alert(a.getX()); // вызов функции
alert(a.getX); // вывод самого объекта функции

JSprog 24.08.2009 20:56

Как сделать то чтобы выводился не строковый вариант функции а результат?
И есть ли у экземпляра объекта свойство prototype
Счяс результат наших прерий не пойму) Дождусь твоих ответов уйду спать и завтро утром всё перечитаю
И поставь плиз + =)

JSprog 24.08.2009 20:58

Кстате зайди в соседнию тему почему там генератор чисел не работает?

Dmitry A. Soshnikov 24.08.2009 21:35

Цитата:

Сообщение от JSprog
Как сделать то чтобы выводился не строковый вариант функции а результат?

Ну я ж говорю - вызвать её - поставить скобки вызова:

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


Цитата:

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

Надо подвести итог и собрать воедино то, что мы тут наобсуждали.

1. Есть конструкторы и есть объекты, порождаемые от этих конструкторов:

function A(x) { // конструктор
  this.x = x;
}

var a = new A(10); // объект "а", порождаемый конструктором А
var b = new B(20); // объект "b", порождаемый конструктором А


Здесь "А" - конструктор, "а" и "b" - порождаемые от "А" объекты. Внутри конструктора this указывает на создаваемый объект, поэтому "а" и "b" имеют свойство "x".

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

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

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

alert(a.hasOwnProperty('x')) // true
alert(b.hasOwnProperty('x')) // true
alert(a.hasOwnProperty('getX')) // true
alert(b.hasOwnProperty('getX')) // true


3. Узнал, что у порождаемых объектов есть прототип, в котором хранятся общие для всех экземпляров свойства и методы. Поэтому, методы, поскольку они одинаковые, удобней хранить в прототипе:

function A(x) {
  this.x = x;
}

A.prototype.getX = function () {};

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

alert(a.hasOwnProperty('x')) // true
alert(b.hasOwnProperty('x')) // true
alert(a.hasOwnProperty('getX')) // false!
alert(b.hasOwnProperty('getX')) // false!

// один и тот же метод
alert(a.getX == b.getX) // true
alert(a.getX === A.prototype.getX); // true
alert(b.getX === A.prototype.getX); // true


4. Узнал, что конструктор и ссылка конструктора .prototype связаны с порождаемым объектом лишь на этапе создания. Дальше, этот конструктор и ссылка .prototype могут быть обnull'ены, но порождённый объект всё равно будет иметь связь с прототипом - посредством внутренней неявной (скрытой) ссылки объекта на прототип. Эта ссылка называется [[Prototype]]. В браузере Firefox, её можно получить через .__proto__ (это я уже сам прочитал ;)):

function A(x) {
  this.x = x;
}

A.prototype.getX = function () {};

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

alert(A.prototype.getX === a.__proto__.getX); // true, вот она, настоящая ссылка на прототип

alert(A.prototype.getX === b.__proto__.getX); // true, и здесь

// поэтому, мы можем присвоить null
A.prototype = null;
A = null;

// но всё равно достучаться до метода .getX из прототипа
// через .__proto__
alert(a.getX()); // 10
alert(b.getX()); // 20

// Просто изначально, A.prototype и a.__proto__ и b.__proto__
// указывают на один и тот же объект:

// A.prototype ---> [Прототип] <-- a.__proto__ и <-- b.__proto__


При этом, явно __proto__ указывать не надо. Это и есть наследование, основанное на прототипах: если свойство/метод не найдены в самом объекте, его поиск продолжается в прототипе. Т.е. метод .getX не найден в самом объекте "а", но будет найден в a.__proto__.getX (или, по стандарту a.[[Prototype]].getX). Аналогично с объектом "b".

5. Конструктор сам может хранить свои свойства (как в примере в начале темы):

function A(x) {
  this.x = x; // свойство экземпляра
}
A.x = 100; // свойство конструктора

var a = new A(10);
alert(a.x);
alert(a.constructor.x); // 100


Поправь, если я где-то ошибся.

JSprog 25.08.2009 08:27

Подскажите пожалуйста=)
<html>
<head> 
 <script language="javascript" type="text/javascript">
function getRandom300(m,n){
return Math.floor(Math.random()*(n-m+1))+m;
}
function getRandom6(){
n6=getRandom300(100000,999999);
document.getElementById(b1).innerHTML=n6
return sla1;
}
getRandom6()
</script>
</head>
<body>
<b id="b1"></b>
</body>
</html>

Не как не пойму в чём дело не может код найти с id b1
Цитата:

Сообщение от Dmitry A. Soshnikov
в котором хранятся общие для всех экземпляров свойства

А вот свойства надо проверить

Kolyaj 25.08.2009 09:11

Цитата:

Сообщение от JSprog
Не как не пойму в чём дело не может код найти с id b1

Когда вызывается getRandom6 элемент с id b1 еще не существует.

Dmitry A. Soshnikov 25.08.2009 09:24

Цитата:

Сообщение от JSprog
А вот свойства надо проверить

Ну, а в остальном-то, всё правильно я понял?

JSprog 25.08.2009 09:51

Да=)
Теперь написано что
document.getElementbyId(b1)=null

В firebug что делать?

B~Vladi 25.08.2009 10:32

Ну что, закончили?:)

JSprog 25.08.2009 11:37

Надо ещё свойства потестить в прототипе

Dmitry A. Soshnikov 25.08.2009 11:41

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

JSprog 25.08.2009 11:43

:cray: :cray: :cray:
Почему тогда код не работает?
пишет document.getElementById(b1) is null

B~Vladi 25.08.2009 11:47

Кому что не понятно?! Надеюсь с первоначальным кодом разобрались?!

JSprog 25.08.2009 11:49

Мне не понятно
<html>
<body> 
<b id=b1></b>
 <script language="javascript" type="text/javascript">
function getRandom300(m,n){
return Math.floor(Math.random()*(n-m+1))+m;
}
function getRandom6(){
n6=getRandom300(100000,999999);
document.getElementById(b1).innerHTML= n6
}
getRandom6()
</script>
</body>
</html>

document.getElementById(b1) is null
пишет firebug
С первым кодом разобрались

Kolyaj 25.08.2009 11:50

Цитата:

Сообщение от Dmitry A. Soshnikov
но, почему-то, пишет, что

Потому что он тебе плюсанул. А менятся нехорошо :)

Цитата:

Сообщение от JSprog
пишет document.getElementById(b1) is null

Потому что переменная b1 у тебя неопределена. В кавычки возьми.

B~Vladi 25.08.2009 11:51

document.getElementById(b1)

b1 - нет такой переменной (undefined). Сюда нужно передавать 'b1'.

JSprog 25.08.2009 11:51

эта не переменая а значение свойства id

B~Vladi 25.08.2009 11:52

Цитата:

Сообщение от JSprog
эта не переменая а значение свойства id

Дк значением что является?! Текстовая строка...

Dmitry A. Soshnikov 25.08.2009 11:53

Цитата:

Сообщение от Kolyaj
Потому что он тебе плюсанул. А менятся нехорошо

Да, действительно, только тут, реально парень пытался объяснить, надо было прибавить плюсик.

JSprog, для разных проблем и кодов создавай отдельные темы.

B~Vladi 25.08.2009 11:55

Цитата:

Сообщение от JSprog
и как её опредилить?

Ты же знаешь её! Зачем определять?!
getElementById - принимает в качастве параметра выражение, возвращаемое текстовую строку. Выражение 'b1' - возвращает значение b1. У тебя же синтаксически передаётся имя переменной b1.

JSprog 25.08.2009 12:00

Ты про что?:)

B~Vladi 25.08.2009 12:01

Про твой вопрос. Не заметно?!

JSprog 25.08.2009 12:01

Какой вопрос? иди отдохни

JSprog 28.08.2009 10:51

Люди что будет значить синтаксис если с обычной переменной например var x=4 указать что-нибудь рядом в квадратных скобках например x[name]

B~Vladi 28.08.2009 10:58

Всё, счем ты работаешь в JS - объекты.

Переменная x, равная 4 - это объект типа Number.
У него есть те же свойства и методы, что и у встроенного объекта Number, т.к. это его экземпляр.

Далее, если записать x[name] - произойдёт обращение к свойству объекта x, имя которого вернёт переменная name.
Если записать x['name'] - будет обращение конкретно к свойству name.

Если ты знаешь - возможны 2 вида обращения к свойствам объекта:

1. Obj.property
2. Obj['property']

Kolyaj 28.08.2009 11:19

Цитата:

Сообщение от B~Vladi
Всё, счем ты работаешь в JS - объекты.

Не всё.
var x = 4;
x.a = 5;
alert(x.a);  // undefined

JSprog 28.08.2009 12:00

Цитата:

Сообщение от B~Vladi
в JS - объекты.

Это не объект а элементарный тип данных
Хотя свойства и методы есть из-за обёртки

JSprog 28.08.2009 12:03

Что-то я не понял что будет если не записать кавычек x[name] можно по подробнее
Всё ясно например
name=uuu
x[name]
обратитса к свойству uuu?

B~Vladi 28.08.2009 15:21

Ой, да, простая запись
var x=4

не создаёт объект, но наследует методы объекта Nubmer.

Цитата:

Сообщение от JSprog
обратитса к свойству uuu?

Да, только записывать надо так:
var name='uuu';


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