2013-11-12 4 views
6

В настоящее время я изучаю javascript, и есть что-то, чего я не понимаю.Является ли String экземпляром объекта String()?

//This means that I am using a method from the String.prototype 
"ThisIsMyString".length 

Так что, если я использую ("ThisIsMyString" InstanceOf String) было предположить, чтобы вернуться правда, не так ли? Но получается, что возвращает false .. и я верю, что это потому, что примитивный тип.

Вот мой вопрос: если «ThisIsMyString» не является экземпляром String, как он может получить доступ к свойству из этого объекта? Какая часть загадки, которую я не знаю?

+1

Проверьте это http://stackoverflow.com/questions/17256182/javascript-string-literal-vs-string-object – PSL

+0

Будьте осторожны с условиями: Javascript не имеет «примитивных типов», но имеет «литералы» (как большинство языков). Однако они не считаются отдельными типами, а языковыми конструкциями, которые действительно не подходят для модели OO. –

+1

@JohannesH. Не совсем ... [§4.3.2 примитивное значение] (http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.2) –

ответ

0

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

+0

На всякий случай, когда вы заметили: ниспадайте свой первоначальный отклик, поскольку это просто не соответствует действительности. Лучше сейчас;) –

+0

@JohannesH. ха-ха не беспокоится! Вы были более чем правы, чтобы проголосовать за меня, прежде чем я исправил свою глупость. –

1

String.length не

метод из String.prototype

length является свойство Строки

See the MDN docs for String.length


Чтобы ответить на ваш вопрос, хотя, причина "hello" instanceof String возвращает ложные лежит в том, как instanceof actualy работает

Object.getPrototypeOf("hello") 
// TypeError: Object.getPrototypeOf called on non-object 

Однако это, как ваша строка литерал имеет доступ к этим способам/свойствам

"my string".constructor === String 
// true 

"my string".__proto__ === String.prototype 
// true 

Если вы хотите фактический экземпляр String

var str = new String("hello"); 
str instanceof String 
// true 
+0

Факты, что '' моя строка.конструктор === String' и '' моя строка ".__ proto__ === String.prototype' не являются ответом, а частью того же поведения. Причиной является точечный оператор, который временно преобразует строковый литерал в объект String для выполнения требуемой операции. – basilikum

Смежные вопросы