1

JavaScript で多重継承をシミュレートしようとしているので、2 つの JavaScript オブジェクトの競合するメソッド名のリストを取得する方法を見つける必要があります。2 つのオブジェクトの関数名のリストを生成し、2 つのクラス間で同じ関数名をすべて見つけることはできますか?

    function base1(){
        this.printStuff = function(){
            return "Implemented by base1";
        };
    }

    function base2(){
        this.printStuff = function(){
            return "Implemented by base2";
        };
    }

function getConflictingFunctionNames(object1, object2){
    //get a list of conflicting function names between the two objects. 

    //to be implemented.
}

console.log(getConflictingFunctionNames(base1, base2)); //this should print ["printStuff"]
4

2 に答える 2

2

次の手順に従う必要があります。

  1. 各オブジェクトの独自のプロパティ名をすべて取得します。
  2. 関数をフィルタリングします。
  3. 両方のセットのユニオンを作成します。

最初の 2 つの手順は、1 つの関数に組み合わせることができます。

function getOwnFunctionNames(object) {
    var properties = Object.getOwnPropertyNames(object);
    var length = properties.length;
    var functions = [];

    for (var i = 0; i < length; i++) {
        var property = properties[i];
        if (typeof object[property] === "function")
            functions.push(property);
    }

    return functions;
}

次に、2 つのオブジェクトの関数セットの和集合を見つける必要があります。

function getConflictingFunctionNames(object1, object2) {
    var functions1 = getOwnFunctionNames(object1);
    var functions2 = getOwnFunctionNames(object2);
    var length = functions1.length;
    var functions = [];

    for (var i = 0; i < length; i++) {
        var functionName = functions1[i];
        if (functions2.indexOf(functionName) >= 0)
            functions.push(functionName);
    }

    return functions;
}

これで、これらの関数で好きなことを行うことができます。

ここでデモを参照してください: http://jsfiddle.net/gVCNd/

于 2013-03-11T02:08:52.953 に答える
0

一般的な名前付きメソッドを見つけたいだけの場合は、次のようにします。

function getCommonNamedMethods(obj1, obj2) {
  var result = [];

  for (var p in obj1) {

    if (typeof obj1[p] == 'function' && typeof obj2[p] == 'function' ) {
      result.push(p);
    }
  }
  return result;
}

オブジェクトの独自のプロパティのみが必要な場合は、独自のプロパティテストを含めます。

function getCommonNamedMethods(obj1, obj2) {
  var result = [];

  for (var p in obj1) {

    if (obj1.hasOwnProperty(p) && typeof obj1[p] == 'function' &&
        obj2.hasOwnProperty(p) && typeof obj2[p] == 'function' ) {
       result.push(p);
    }
  }
  return result;
}
于 2013-03-11T03:00:38.390 に答える