2016-05-27 2 views
1

Игнорируя все лучшие практики, у меня есть довольно академический вопрос, который я попрошу ради любопытства.Изменение примитивной строки Ссылки на строковый объект

Как вы знаете, вы можете добавить пользовательские свойства в строку Объект:

var s = new String("initial string"); 
var s.customProperty = "Please Don't Forget about me"; 

Можно (без создания нового объекта строки), чтобы изменить строку примитивно, что «s» ссылки ?

В частности, я хочу изменить «s» (выше), так что сек == «новая строка», но после внесения этого изменения, я хочу s.customProperty по-прежнему указывать на строку -примитивный: «Пожалуйста, не забывайте обо мне». Опять же, я хочу достичь этого, не создавая никаких новых строковых объектов.

var s = new String("initial string"); 
var s.customProperty = "Please Don't Forget about me"; 

// What code must preceed the following "if statement" in order 
// for it to return "true" (giving the restrictions I described 
// in the paragraphs of this post)? 

if(s == "new string" && s.customProperty == "Please Don't Forget about me") 
{ 
    console.log("true"); 
} 
else 
{ 
    console.log("false"); 
} 

Другими словами, можно изменить референс-указатель в строку объекта без потери или клонировать все пользовательские свойства, которые были добавлены к этой строки объект?

ответ

4

Можно ли изменить строку-примитив, что «ы» ссылки?

порядка № [[StringData]] (ES6)/[[PrimitiveValue]] (ES5) она содержит это internal slot и не может быть мутирован.

... без необходимости создавать любые новые строковые объекты.

Нет никакого способа обойти это.

Что вы можете сделать, это подкласс String и перезаписать все методы для ссылки на свойство mutable, но этот совет так же хорош, как «не использовать объекты String». См. Также ответы на обратную задачу Is there a way to Object.freeze() a JavaScript Date?.

+0

Спасибо за информативный ответ. Быстрые мысли. , , : Объекты String были бы интереснее более гибкими, если бы они ссылались на нечто похожее на объект-свойство, а не на внутренний слот. –

+0

@ LonnieBest: неизменность управляет всем :-) Если вы хотите экземпляры с состоянием, просто используйте стандартные объекты с методом 'toString'. – Bergi

-1

String prototype на помощь!

Так что в основном что-то вроде этого:

String.prototype.customProperty = "Please Don't Forget about me"; 

Тогда вы можете назвать это так:

"Your string".customProperty 
+3

Теперь _all_ ваши объекты 'String' имеют это свойство, я не думаю, что это то, что происходит после OP. –

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