2017-06-21 2 views
1

これは矢印機能を使用して解決できると思いますが、わかりません。私はrender機能の中でthis.propsにアクセスしたいと思います。私は議論としてそれを渡すことができますが、むしろそうしないことを知っています。これは矢印関数を使って可能ですか?もしそうなら、私は何を変更する必要がありますか?プロパティにアクセスするためにこのJavaScriptを矢印関数を使用するように変更するには

class View { 
    constructor(options) { 
    this.options = options; 
    } 
    render(el, props = {}) { 
    this.props = props; 
    el.innerHTML = this.options.render(el); 
    } 
} 

var Test = new View({ 
    render() { 
    return `${this.props.test}` 
    // 
    // Also, tried ${props.test} in my template literal 
    // 
    } 
}); 

Test.render(document.getElementById("main"), { 
    test:"123" 
}) 
+0

class View { constructor(options) { this.options = options; } render(el, props = {}) { el.innerHTML = this.options.render(props); } } var test = new View({ render: x => '${x.test}' }); test.render(document.getElementById("main"), { test:"123" });
<div id="main"></div>

いいえ、これは矢印の機能を使用して正確に* *ことはできません。あなたは 'this.options.render.call(this、el)'を探しています。 – Bergi

+0

関連:[矢印関数と関数宣言/式:それらは同等か交換可能ですか](https://stackoverflow.com/q/34361379/218196) –

答えて

3

矢印機能を使用すると、呼び出し元関数スペースではなく、外部クロージャのthisにアクセスできます。関数の定義のポイントは、それを呼び出し先の変数から切り離すことです。矢印関数は単に文脈、つまりthisオブジェクトを定義のクロージャと同じにします。そのそこに定義されているので

var that = this; 
(function(){console.log(that === this)})(); 

は矢印の機能がthisコンテキストにアクセスできることを 誤った理由を印刷しますがこのように

var that = this; 
(() => console.log(that === this))(); 

は、真の印刷され、それはそこに呼ばれていないため、です。

コンテキストオブジェクトを強制する唯一の方法は、あなたがthis.props = props割り当てが必要ですFunction.prototype.callまたはFunction.prototype.apply

+0

あなたは揺れます! 'this.options.render.call(this、el)はこのトリックを行います。 –

1

を使用しているのですか?あなたはこのようなことをすることができます。

関連する問題