2016-03-25 1 views
1

utopic目標:docstringを有効にするためにjavascript関数自体のインスタンスを取得します。出来ますか?

str = "hello" 
str.doc = "this is a string" 
console.log(str) //prints 'hello' 
console.log(str.doc) //should prints the docstring 

ただし、文字列は不変であり、これ以上のことはできません。私は回避しようとした方法

str = new String("hello") 
str.doc = "this is a string" 
console.log(str) //prints the string object but not 'hello' 
console.log(""+str) //prints "hello" 
console.log(str.doc) //correctly prints the docstring 

あなたが見ることができるように.valueOf()または.toString()が呼び出されたときにのみ、あなたは生の文字列を取得します。目標は、直接呼び出したときに文字列を取得することです。

回避策のもう一つの誘惑(息切れのためcoffescriptで、3行対〜15)

class Configuration 
    constructor: (@value, @doc) -> 
    @::valueOf = -> @value 

これはnew String()にかなり似ています。オブジェクトのvalueOf()メソッドのプロトタイプを作成するだけです。問題は上記と同じです。

が、それは私の全体のコードベースをリファクタリングする必要がなくて、これを達成するためにいくつかの方法で可能です:あなたは直接​​生の文字列を出力し、両方console.log(str.doc)

質問を使用することはできませんか?

+0

これは非常に興味深い質問です。ユースケースは何ですか? – woozyking

+0

角度アプリの設定については、私は後でどこでも使うことができるよりも、(バックエンドのURLのような)公開環境変数を、env固有のファイルに格納して、シングルトンで定義します。 –

+0

これらの文字列の使い方の例を共有できますか?すべての実用的な目的のため、 'new String()'はあなたの問題を解決するはずです。 – gurvinder372

答えて

0

を参照してください、私はstr + ""ので、本当にきれいではないnew String()を、使用してだけ迅速な回避策のようだとstrのような変数を置き換えるリファクタリングのビットのために行きますよ。

config = { 
    mySetting: { 
     value: "settingValue", 
     docstring: "my doc string" 
    } 
} 

そして必要と一緒に使用して:実際には、最適な解決策は、単純に次のようなシングルトンを使用することですconfig.mySetting.value をしかし、それは、複雑なアプリケーションのリファクタリングの多くを行うにはいないだろう今の優先順位。あなたのすべての応答をありがとう!

0

私はこれを容認していないが、それは任意の文字列引数でのvalueOfを呼び出すようにしますが、console.logをオーバーライドすることができます:

var oldConsoleLog = console.log; 
console.log = function () { 
    oldConsoleLog.apply(console, [].map.call(arguments, function (arg) { return arg instanceof String ? arg.valueOf() : arg; })); 
}; 
2

あなたは文字列のプロトタイプを作成することができます。コメントで述べたようfiddle

// String.prototype.__defineGetter__("doc", function() { return "test" }); //deprecated 

Object.defineProperty(String.prototype, "doc", { 
    get: function doc() { 
    return "this is a string"; 
    } 
}); 
console.log("this is a string".doc); 
+0

ES5ブラウザで非推奨の方法がサポートされています – sniels

+0

あなたのソリューションは実際には動作しますが、文字列はまったくきれいではありません。一般に、私は「汚い」ネイティブオブジェクト –

関連する問題