1

次のようなカスタム オブジェクト定義がいくつかあります。

var Class1 = function () { this.value = ''; };
var Class2 = function () { this.data = ''; };

Class1.prototype = {
    setObject: function () {
        for (var prop in this){
            if (typeof obj[prop] != 'undefined')
                this[prop] = obj[prop];
        }
    }
}

Class2.prototype = {
    setObject: function () {
        for (var prop in this){
            if (typeof obj[prop] != 'undefined')
                this[prop] = obj[prop];
        }
    }
}

このメソッドsetObjectをデフォルトですべてのクラスに持たせる方法はありますか?

その関数を JavaScript の型から継承 (シミュレート) したObject方が良いですか、それともグローバル関数を使用するか、1 つずつ定義する方が良いですか?

4

3 に答える 3

2

jQuery やアンダースコアなどのライブラリを使用する場合は、回復力のあるextendメソッド ( $.extend、およびを参照_.extend) に既にアクセスできるため、これらのカスタム オブジェクト タイプについて車輪を再発明する理由はないと言えます。

それ以外の場合は、共通の基本クラスを使用して継承Class1できます。Class2

function BaseClass() {
    ...
}
BaseClass.prototype = {
    setObject: function (obj) {...}
};

function Class1() {
    ...
}
Class1.prototype = new BaseClass();

function Class2() {
    ...
}
Class2.prototype = new BaseClass();

var a = new Class1();
a.setObject({...});

var b = new Class2();
b.setObject({...});

setObjectまたは、これらのオブジェクトに共通の祖先を含めない場合は、同じ関数参照を使用するように定義できます。

function setObject(obj) {
    ...
}

function Class1() {
    ...
}
Class1.prototype = {
    setObject: setObject
};
function Class2() {
    ...
}
Class2.prototype = {
    setObject: setObject
}
于 2013-08-15T17:10:42.060 に答える
0

Ivan は、オブジェクトから継承する方法を示しました。コンストラクター関数と継承の使用に関する詳細情報は、ここで見つけることができます:プロトタイプの継承 - 執筆

mixin パターンも使用できます。

var mixIn=function(target,source){
  for(fn in source){
    if(source.hasOwnProperty(fn)){
      target.prototype[fn]=source[fn];
    }
  }
};
var ObjectSettable = {
    setObject: function () {
        for (var prop in this){
            if (typeof obj[prop] != 'undefined')
                this[prop] = obj[prop];
        }
    }
};
var Class1 = function () { this.value = ''; };
//... Class1.prototype stuff
mixIn(Class1,ObjectSettable);
于 2013-08-16T00:18:25.450 に答える
0

あなたがそれを知っているかどうかはわかりませんが、Javascript にはクラスやメソッドはありません。オブジェクト、関数、および「プロトタイプ」と呼ばれる特別なプロパティのみがあります。

クラスをシミュレートする一般的な方法は次のとおりです。

var Class  = function () { this.prop = "hi" };
Class.prototype.doMethod = function () { this.prop = "hi2"; };
Class.prototype.setObject: function () {
    for (var prop in this){
        if (typeof obj[prop] != 'undefined')
            this[prop] = obj[prop];
    }
}

// those classes "inherit" from Class
var Class1 = function () { Class.call(this); this.value = ''; };   
Class1.prototype = new Class();

var Class2 = function () { Class.call(this); this.data  = ''; };
Class2.prototype = new Class();
于 2013-08-15T17:27:33.677 に答える