Javascript 如何使用jqueryextend实现多重继承

Javascript 如何使用jqueryextend实现多重继承,javascript,jquery,multiple-inheritance,extend,Javascript,Jquery,Multiple Inheritance,Extend,根据道格拉斯·克罗克福德(Douglas Crockford)的说法,我可以使用这样的东西(稍加调整)。。。但我对jQuery的实现方式感兴趣。使用$.extend是否是一种良好的做法 我有4门课: var A = function(){ } A.prototype = { name : "A", cl : function(){ alert(

根据道格拉斯·克罗克福德(Douglas Crockford)的说法,我可以使用这样的东西(稍加调整)。。。但我对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的实例时?我怎样才能克服这个问题

使用$.extend是否是一种良好的做法

$.extend
对单例有用,但对原型并不理想

使用
Object.create
(或Crockford的polyfill),您可以轻松创建这样的类。我正在使用
$.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

一个对象只有一个原型,因此不能通过一次调用将其作为其他两种类型的实例

$.extend(新建B(),新建D(),…
创建一个作为B实例的对象。然后将D的所有属性复制到新创建的对象。但该对象仍将是B实例


使用
$.extend
本身既不好也不坏。但是您必须使用jQuery,这会降低代码的可重用性。您必须意识到
$.extend
会覆盖同名的属性,这可能是您想要的,也可能不是您想要的。

注意,实际上,在duck类型的语言中,您很少关心如果一个对象是某个对象的实例。为什么要检查instanceof D?请注意,通常您真正需要的是多重继承不适用于
instanceof
,因为对象只能有一个线性原型链。tnx作为答案!我想有一种方法可以在干净的编码中同时使用多重继承?嗯,多重in错误与干净的编码相反;)如果instanceof对您来说不是绝对必要的,那么您的代码就可以了。没办法,对不起。你能看看下面的答案吗。如果你能检查一下。。。编辑:好的,我不能回答我自己的问题。下面是外部链接:
$.extend
基本上就是这么做的。区别在于这段代码创建了一个新类型。非常好的示例。tnx。它给了我新的观点。我决定坚持这里描述的方法:现在。但是,有没有一种方法可以通过干净的编码同时使用多重继承呢?