Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему не работает этот код? (5 строк) (https://javascript.ru/forum/misc/30325-pochemu-ne-rabotaet-ehtot-kod-5-strok.html)

imissyouso 31.07.2012 19:56

Почему не работает этот код? (5 строк)
 
function Test(){}
Test.prototype = new String("test");
var test = new Test();
console.log(test);
//почему не выводит "test"? NS_ERROR_XPC_BAD_CONVERT_JS: Could not convert JavaScript argument arg 0 [nsIDOMWindow.alert]
alert(test);
//тоже не работает TypeError: String.prototype.valueOf called on incompatible Object
alert(test.toString());

Сабж.

oneguy 31.07.2012 20:34

У String.prototype методы valueOf и toString принимают в качестве аргумента this только строки и объекты String. На другие значения они бросают TypeError.
У вас test не является объектом String, так как был создан с помощью юзерского конструктора.

imissyouso 31.07.2012 21:06

Цитата:

Сообщение от oneguy
У String.prototype методы valueOf и toString принимают в качестве аргумента this только строки и объекты String. На другие значения они бросают TypeError.
У вас test не является объектом String, так как был создан с помощью юзерского конструктора.

ну вот у toString ссылка this будет на объект test типа Test, у test прототип - ссылка на объект типа String. Следовательно всё что toString не сможет найти в test, будет искать в прототипе и там должен найти, потому что он ссылается на обект типа String. По логике же должно работать. Не? Делаю дамп объекта test и вижу что внешне у него такая же структура как и у любого объекта типа String. Наверное только внешне? Объясните пожалуйста)
Как исправить этот код чтобы при вызове alert(test) или alert(test.toString()) выводилось окошко с надписью "test". Спасибо.

oneguy 31.07.2012 21:31

Цитата:

Сообщение от imissyouso
Спасибо. Как исправить этот код?

Извините. я не совсем представляю что должен делать этот код. Опишите, пожалуйста, задачу.

imissyouso 31.07.2012 21:36

Цитата:

Сообщение от oneguy (Сообщение 193356)
Извините. я не совсем представляю что должен делать этот код. Опишите, пожалуйста, задачу.

отредактировал верхний пост

oneguy 31.07.2012 22:45

Цитата:

Сообщение от imissyouso
Следовательно всё что toString не сможет найти в test, будет искать в прототипе и там должен найти, потому что он ссылается на обект типа String. По логике же должно работать.

Это неправильно. Такая особенности работы функции String.prototype.toString, что она принимает только строки и объекты String, и не принимает даже наследников объектов String (которые сами не являются объектами String).
Цитата:

Сообщение от imissyouso
Делаю дамп объекта test и вижу что внешне у него такая же структура как и у любого объекта типа String. Наверное только внешне?

Да. Только внешне. test является объектом класса Object, как показывает
Object.prototype.toString.call(test)

а объекты String имеют класс String. У test нет, в отличии от объектов класса String, своего внутреннего строкового значения.
Цитата:

Сообщение от imissyouso
Как исправить этот код чтобы при вызове alert(test) или alert(test.toString()) выводилось окошко с надписью "test". Спасибо.

Проще всего делать test наследником обычного объекта, и в нём определить метод toString.
function Test(){}
Test.prototype.toString=function () {
  return "test";
};
var test = new Test();
console.log(test);
alert(test);
alert(test.toString());


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