Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.07.2012, 19:56
Интересующийся
Отправить личное сообщение для imissyouso Посмотреть профиль Найти все сообщения от imissyouso
 
Регистрация: 28.06.2011
Сообщений: 15

Почему не работает этот код? (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());

Сабж.
Ответить с цитированием
  #2 (permalink)  
Старый 31.07.2012, 20:34
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

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

Последний раз редактировалось oneguy, 31.07.2012 в 20:44.
Ответить с цитированием
  #3 (permalink)  
Старый 31.07.2012, 21:06
Интересующийся
Отправить личное сообщение для imissyouso Посмотреть профиль Найти все сообщения от imissyouso
 
Регистрация: 28.06.2011
Сообщений: 15

Сообщение от 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". Спасибо.

Последний раз редактировалось imissyouso, 31.07.2012 в 21:38.
Ответить с цитированием
  #4 (permalink)  
Старый 31.07.2012, 21:31
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от imissyouso
Спасибо. Как исправить этот код?
Извините. я не совсем представляю что должен делать этот код. Опишите, пожалуйста, задачу.
Ответить с цитированием
  #5 (permalink)  
Старый 31.07.2012, 21:36
Интересующийся
Отправить личное сообщение для imissyouso Посмотреть профиль Найти все сообщения от imissyouso
 
Регистрация: 28.06.2011
Сообщений: 15

Сообщение от oneguy Посмотреть сообщение
Извините. я не совсем представляю что должен делать этот код. Опишите, пожалуйста, задачу.
отредактировал верхний пост
Ответить с цитированием
  #6 (permalink)  
Старый 31.07.2012, 22:45
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от 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());

Последний раз редактировалось oneguy, 31.07.2012 в 22:47.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает код в ие. Событие click. Marv jQuery 2 13.02.2012 13:49
Почему то работает, то нет? gyunduz Общие вопросы Javascript 0 22.01.2011 16:08
Не работает код из внешнего файла в IE6 Petka jQuery 2 03.03.2010 16:09
почему код не работает в опере?..... Mr .NET Общие вопросы Javascript 1 18.01.2009 12:15
почему не работает <body onload=test()> Ichigeki Общие вопросы Javascript 11 29.10.2008 13:49