2016-05-27 18 views
1

すべてのベストプラクティスを無視して、私は好奇心のために質問するだろうという学問的な質問があります。ご存知のようにプリミティブ文字列を文字列オブジェクトの参照に変更する

は、文字列オブジェクトにカスタムプロパティを追加することができます。

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

はそれが可能です(新しい文字列オブジェクトを作成せずに)、文字列プリミティブこと「S」参照を変更します?

具体的には、私は(上記)「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

は、それが「S」の参照という文字列プリミティブを変更することは可能ですか?

号が含ま[[StringData]](ES6)/ [[PrimitiveValue]](ES5)はinternal slotあり、突然変異させることができません。

...新しい文字列オブジェクトを作成する必要はありません。

これを回避する方法はありません。

Stringをサブクラス化し、すべてのメソッドを上書きして可変プロパティを参照することですが、そのアドバイスは「Stringオブジェクトを使用しないでください」と同じくらい良いです。逆問題Is there a way to Object.freeze() a JavaScript Date?の回答も参照してください。

+0

有益な答えをありがとう。一瞬の思い。 。 。 :文字列オブジェクトは、内部スロットではなくオブジェクトプロパティに類似したものを参照すると、面白いほど柔軟性があります。 –

+0

@LonnieBest:不変性はすべてそれを支配します:-)ステートフルインスタンスが必要な場合は、標準オブジェクトを 'toString'メソッドで使用してください。 – Bergi

-1

String prototypeレスキュー!

だから、基本的にこのような何か:

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

その後、あなたはこのようにそれを呼び出すことができます。

"Your string".customProperty 
+3

あなたの 'String'オブジェクトはそのプロパティを持っていますが、私はそれがOPの後にあるとは思いません。 –

関連する問題