Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   немного глубже о .toString() (https://javascript.ru/forum/misc/25055-nemnogo-glubzhe-o-tostring.html)

graduate 24.01.2012 02:33

немного глубже о .toString()
 
Почему Object.toString !== Object.prototype.toString ??

Gvozd 24.01.2012 02:44

console.log(Object.toString === Object.prototype.toString);//false
console.log(Object.toString === Function.prototype.toString);//true
console.log(Object.toString === Function.toString);//true

Object - функция-конструктор объектов типа Object
Поэтому ее toString берется из ее прототипа, который общий для всех функций, а не из прототипа объектов.

DreamTheater 24.01.2012 02:44

Потому что Object это, скажем, "класс", а {} это его экземпляр, соответственно {} получает все свойства Object.prototype.

То бишь в Вашем примере валидно будет написать {}.toString === Object.prototype.toString

Kolyaj 24.01.2012 09:50

Цитата:

Сообщение от DreamTheater
Потому что Object это, скажем, "класс"

Скажите лучше "функция".

trikadin 24.01.2012 09:53

Цитата:

Сообщение от Kolyaj
Скажите лучше "функция".

Ну блин. Давайте уже придумаем, как называть функции-конструкторы.

Kolyaj 24.01.2012 09:54

Цитата:

Сообщение от trikadin
Давайте уже придумаем, как называть функции-конструкторы.

Конструкторы.

trikadin 24.01.2012 09:58

Kolyaj, не, не очень. Объект конструктора Array?

Kolyaj 24.01.2012 10:06

Связку конструктор-прототип вполне можно называть классом. В данной же теме акцент именно на том, что Object -- это функция. А что это ещё и конструктор тут неважно.

trikadin 24.01.2012 10:07

А, окей.

Просто я так и не понял, почему в "javascript нет классов!!!!111" и т.д.

Kolyaj 24.01.2012 10:15

Цитата:

Сообщение от trikadin
Просто я так и не понял, почему в "javascript нет классов!!!!111" и т.д.

Потому что под классами обычно понимают Java-style классы. А таких нет. Если собеседник понимает, что говоря класс, я имею в виду именно конструктор с прототипом, то я говорю класс, так короче.

trikadin 24.01.2012 10:35

Ну, наверное, вы правы...

B~Vladi 24.01.2012 13:17

Цитата:

Сообщение от trikadin
Ну, наверное, вы правы...

Не наверное, а прав.
Но классы могут быть реализованы в других окружениях, яркий тому пример - ant. Там можно запускать JavaScript код и работать с Java-классами.

DreamTheater 24.01.2012 13:26

B~Vladi, а можете рассказать поподробнее на эту тему?

B~Vladi 24.01.2012 14:28

Цитата:

Сообщение от DreamTheater
а можете рассказать поподробнее на эту тему?

На какую тему?

DreamTheater 24.01.2012 15:51

О JavaScript и Ant.

B~Vladi 24.01.2012 16:16

В ант, посредством тега script, можно выполнять JavaScript код.

Для таких скриптов доступна некая базовая объектная модель. В частности, доступен глобальный объект this, в котором хранятся все переменные, определённые в текущем коде скрипта. Так же в нем доступны объекты задач из текущего ant-файла, для которых установлен атрибут id.
Так же можно получить объект проекта через свойство project или имя проекта (значение атрибута name тега project).

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

Для обращения к конкретному классу, он сначала должен быть импортирован, например:
importClass(java.io.File);


К примеру, класс объекта проекта можно получить так:
importClass(org.apache.tools.ant.Project);

Теперь в глобальной области доступен класс Project.

Свойства экземпляра этого класса описаны здесь.

Либо импорт пакета:
importPackage(java.io);


Для каждой задачи (тега) ant определён свой класс, который наследует от более абстрактных классов, что можно посмотреть в мануале. Кстати, последняя версия ant - 1.8.2, а документация к API существует только для 1.7.1. Но ни что не мешает заглянуть в исходники, особенно при возникновении трудностей.

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

B~Vladi 24.01.2012 16:24

Пример парсинга json для наглядности:
importClass(java.io.File);
importClass(java.io.FileReader);
importClass(java.io.BufferedReader);

var configFile = new File('config.json');

if (!configFile) {
	throw new Error('Can not find configuration file in "' + basedir + File.separator + 'config.json"');
}

var buffer = new BufferedReader(new FileReader(configFile)),
	cfgString = '',
	line;

while (line = buffer.readLine()) {
	cfgString += line;
}

var CONFIG = eval('(' + cfgString + ')');

B~Vladi 24.01.2012 16:27

А, да, забыл добавить ссылку на интерпретатор javascript: http://www.mozilla.org/rhino/doc.html

FINoM 25.01.2012 04:19

Цитата:

Сообщение от Gvozd
Object - функция-конструктор объектов типа Object

Рекурсивный вынос мозга. Курица или яйцо?

trikadin 25.01.2012 07:44

Цитата:

Сообщение от FINoM
Рекурсивный вынос мозга. Курица или яйцо?

Эм. А где рекурсия-то?)

DreamTheater 25.01.2012 10:27

Класс Object наследуется от Чака Норриса :D

FINoM 25.01.2012 12:50

Цитата:

Сообщение от trikadin
Эм. А где рекурсия-то?)

Object — экземпляр самого себя.

Kolyaj 25.01.2012 13:30

Object -- экземпляр Function.

FINoM 25.01.2012 13:40

Цитата:

Сообщение от Kolyaj
Object -- экземпляр Function.

Э, как это? А Function тогда?

UPD Сорри, тупанул. Таки да. Получается тогда что Function сам себе конструктор.

Gvozd 25.01.2012 13:40

Цитата:

Сообщение от Kolyaj
Object -- экземпляр Function.

не только. Еще и экземпляр Object


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