2

Douglas Crockfordによると、 http://javascript.crockford.com/prototypal.htmlのようなものを使用できます(少し調整して)...しかし、jQueryの方法に興味があります。$ .extendを使用するのは良い習慣ですか?

私は4つのクラスを持っています:

            var A = function(){ } 
            A.prototype = {
                name : "A",
                cl : function(){
                    alert(this.name);
                }
            }
            var D = function(){} 
            D.prototype = {
                say : function(){
                    alert("D");
                }
            }

            var B = function(){} //inherits from A
            B.prototype = $.extend(new A(), {
                name : "B"
            });

            var C = function(){} //inherits from B and D
            C.prototype = $.extend(new B(), new D(), {
                name : "C"
            });


            var o = new C();

            alert((o instanceof B) && (o instanceof A) && (o instanceof C)); //is instance of A, B and C 
            alert(o instanceof D); //but is not instance of D

だから、私はすべてのメソッド、プロパティを呼び出すことができます... A、B、C、Dから。oがDのインスタンスであるかどうかをテストしたいときに問題が発生しますか?どうすればこの問題を克服できますか?

4

2 に答える 2

4

$.extend を使用することをお勧めしますか

$.extendシングルトンには便利ですが、プロトタイプには理想的ではありません。

Object.create(またはクロックフォードのポリフィル) を使用すると、このようなクラスを簡単に作成できます。私は$.extend単純にプロパティを処理し、それらにデフォルト値とモジュールパターンを与えて、それを適切に整理するために使用しています。お役に立てれば:

// Helper that makes inheritance work using 'Object.create'
Function.prototype.inherits = function(parent) {
  this.prototype = Object.create(parent.prototype);
};

var Person = (function PersonClass() {

  var _defaults = {
    name: 'unnamed',
    age: 0
  };

  function Person(props) {
    $.extend(this, props, _defaults);
  }

  Person.prototype = {
    say: function() {
      return 'My name is '+ this.name;
    }
  };

  return Person;

}());

var Student = (function StudentClass(_super) {

  Student.inherits(_super); // inherit prototype

  var _defaults = {
    grade: 'untested'
  };

  function Student(props) {
    _super.apply(this, arguments); // call parent class
    $.extend(this, props, _defaults);
  }

  Student.prototype.say = function() {
    return 'My grade is '+ this.grade;
  };

  return Student;

}(Person));

var james = new Student({ name: 'James', grade: 5 });

console.log(james instanceof Student); // true
console.log(james instanceof Person); // true
于 2013-03-11T15:22:58.680 に答える
1

オブジェクトにはプロトタイプが 1 つしかないため、1 回の呼び出しで他の 2 つの型のインスタンスにすることはできません。

$.extend(new B(), new D(), ...B のインスタンスであるオブジェクトを作成します。次に、D のすべてのプロパティが新しく作成されたオブジェクトにコピーされます。しかし、オブジェクトは依然として B のインスタンスです。

使う$.extendこと自体は良くも悪くもありません。ただし、jQuery に縛られているため、コードの再利用性が低下します。また、同じ名前のプロパティを上書きするという事実に注意する必要があり$.extendます。これは、必要な場合とそうでない場合があります。

于 2013-03-11T16:01:07.873 に答える