2

誰かが私がかなり簡単だと思うことで私を助けることができるかどうか疑問に思っています:

基本的に、すべてのデータ型 (組み込み型を含む) のプロトタイプを拡張して、ある種のカスタム関数を許可したいと考えています。

var x = "some string";
var y = 101;

x = "some other value";
y++;

x.onChange();
y.onChange();

これは後の基本的な考え方ですが、実際に私が望むのは、実際に onChange (この例では) を変更して、実際の変数の新しい関数 (標準のプロトタイプ拡張ではなく) を作成することです。

x.onChange = function() {
    alert("x.onChange");
}

y.onChange = function() {
    alert("y.onChange");
}

これは機能していないようですが、非常に単純なものが欠けているに違いありませんか? 私は確かにすべてのオブジェクトとタイプを拡張し、新しい機能を追加できることを意味します...いいえ?

どんな助けでも大歓迎です!

4

3 に答える 3

6

私は、既存の型にメソッドを追加しようとするのではなく、基本型をラップできるオブジェクトを作成することによってこれにアプローチしたくなるかもしれません。これを「観察」値と呼び、次のように実装する場合があります。

function observable(v){
    this.value = v;

    this.valueChangedCallback = null;

    this.setValue = function(v){
        if(this.value != v){
            this.value = v;
            this.raiseChangedEvent(v);
        }
    };

    this.getValue = function(){
        return this.value;
    };

    this.onChange = function(callback){
        this.valueChangedCallback = callback;
    };

    this.raiseChangedEvent = function(v){
        if(this.valueChangedCallback){
             this.valueChangedCallback(v);
        }   
    };
}

これを使用して、任意の値の変更を監視できます (その値が監視可能なクラスのメソッドによってのみ変更される限り、IMO の小さな欠点です)。

このようなものは上記のコードで動作します:

var obs = new observable(123);
obs.onChange(function(v){
         alert("value changed to: " + v);
     });

// the onChange callback would be called after something like obs.setValue(456);

実例はこちら --> http://jsfiddle.net/MeAhz/

于 2011-02-10T12:33:14.660 に答える
0

オブジェクトプロトタイプを拡張します。

Object.prototype.foo = function() { alert('hello world'); };
var a = 1;
a.foo();
于 2011-02-10T12:18:03.207 に答える