Вопрос по google-chrome-devtools, google-closure-compiler, javascript – Как рассчитываются имена классов javascript для пользовательских классов в Chrome Dev Tools?

5

Я пытаюсь определить правила для генерации имен классов в JavaScript. Я вставил этот скрипт в консоль инструментов Chrome dev:

var obj = { 
    Constr : function() {  }
};

var obj2 = obj;
console.log(new obj.Constr());
console.log(new obj2.Constr());

obj2.Constr2 = function() {  };
console.log(new obj.Constr2());
console.log(new obj2.Constr2());

И вот результаты в консоли:

obj.Constr
obj.Constr
obj2.Constr2
obj2.Constr2

Кажется, что имя класса определяется переменной, которой изначально была назначена функция конструктора. Я ищу точные правила, которые CDT использует для генерации этого имени. Кроме того, это то же имя, которое распознает компилятор Google Closure?

Я пытался выяснить, смогу ли я воспроизвести подобное поведение в Firebug, но, похоже, я не могу вывести имена классов в консоли. Как вторичный вопрос, кто-нибудь знает, как увидеть это в firebug?

Ваш Ответ

1   ответ
3

В Javascript нет классов, так как это ООП на основе прототипов, а не на основе классов. Chrome, по-видимому, делает некоторые выводы, чтобы напечатать некоторое описание объекта в консоли, но это не является стандартным Javascript & # x2014; в стандарте объекты не имеют именованного класса, и вы не можете определить имя класса, к которому принадлежит объект, поскольку единственное наследование осуществляется через фактическое[[Prototype]] внутреннее псевдо-свойство, которое также является самостоятельным объектом, без имени или «класса». Обычно вы можете вывести что-то похожее на имя класса, посмотрев наobject.__proto__.constructor.name, который будет возвращать имя функции, которая является конструктором, из которого был создан объект;but эта функция может быть анонимной,or ваш браузер может не поддерживать нестандартный__proto__ имущество,or прототип объекта может не содержать правильную ссылку на его конструктор. Как правило, вы не можете знать «класс» объекта в JS; можно проверить только на потомство (object instanceof Constructor), но это все еще осуществляется в соответствии сconstructor свойство в прототипе объекта, котороеmight быть неверным.

Javascript являетсяvery ОО язык, и на самом деле довольно гибок в этом. Есть много библиотек, создающих типичные ОО на основе классовon top Javascript, и это обычно работает довольно хорошо. Это не обязательно плохо для этих библиотек или самого Javascript.
Так что, как я и опасался, имя, напечатанное CDT, не взято из спецификаций ecmascript. Это всего лишь удобство отладки для разработчика. Я довольно новичок в Javascript, и мне вообще нравится стиль прототипа, но меня разочаровывает, что такие библиотеки, как dojo и extjs, пытаются втиснуться в OO-стиль программирования. Я думаю, что это мешает одной из лучших особенностей Javascript. Andrew Eisenberg

Похожие вопросы