1

このコードを考えると:

function Test(){
    var $D = Date.prototype;
    $D.addDays=function(value){this.setDate(this.getDate()+value);return this;};
    $D.clone = function() {
        return new Date(this.getTime());
    };
    alert(new Date().addDays(5));
    var x = 5;
}

Test();

alert(new Date().addDays(1));
​alert(x);​

alert(x)xは関数に制限されているため、「xisundefined」エラーをスローする唯一のエラーがスローされますTest()

の呼び出しaddDays()は、関数内と関数外の両方で機能します。

これは、Dateプロトタイプのスコープがグローバルであるためだと思います。したがって、クロージャー内で拡張することは関係ありません。

したがって、クロージャー内でDateを拡張したいが、他のJavaScriptが拡張を取得することを許可しない場合、どうすればよいですか?

私が尋ねている理由は、コアjavascriptオブジェクトを拡張するときに、同じ変更を行う可能性のある他のライブラリと競合したくないためです。

4

1 に答える 1

1

あなたが話していることを行うには、いくつかの方法があります。完了したら、変更を削除できます。

function Test() {
    var $D = Date.prototype;
    // ...
    delete $D.addDays;
    delete $D.clone;
}

これは、単一の実行中にのみメソッドが必要な場合に機能します。メソッドを無期限に使用できるようにする必要がある場合は機能しませんが、モジュール内でのみ使用できます。

そうでない場合は、(プロトタイプではなく) Date オブジェクトに拡張メソッドを直接追加できます。モジュール内に、これらの特別なDateオブジェクトを作成する関数を含めることができます。

function createDate() {
    var d = new Date();
    d.method1 = function() { ... };
    d.method2 = function() { ... };
    return d;
}

最後に、プロトタイプを拡張する代わりに、クロージャ内で範囲指定されたヘルパー関数を使用できます。実際、プロトタイプを拡張することは、この場合のシンタックス シュガーにすぎません。

于 2012-07-17T17:51:17.493 に答える