は、次のクラス宣言を考えてみましょう:私たちはここに見ることができるようtest1
の文字列化バージョンを評価Function.prototype.toString()は、有効なJSを返すとは限りません。どうして?
class A {}
A.prototype.test1 = function test1() { console.log("test1") }
は、有効なJSを生成します。
const a = new A
eval(`(${a.test1})`)() // outputs "test1"
しかし、我々は根本的に異なるで私たちのクラスを構築するが、場合同等の方法:
class B {
test2() { console.log("test2") }
}
test2
FAIの文字列化バージョンの評価LS:
const b = new B
eval(`(${b.test2})`)() // SyntaxError: Unexpected token {
(それはクラス宣言に埋め込まれたときを除いて有効なJSされていないtest2() { console.log("test2") }
に文字列化された)
私はたとえば"".indexOf.toString()
ため、評価可能でないという文字列化されたネイティブ関数を理解することができますが含まれる文字列を返します。 [native code]
と私はそれを受け入れる。
しかし、Function.prototype.toString()
がユーザ定義関数(つまり、ソースコードが利用可能な関数)で呼び出されると、有効で評価可能なJSが生成されることを保証する方法はありませんか?
"*クラス宣言に埋め込まれている場合を除いて*" - はい、そうです。 – Bergi