Javascript中继承建模的优缺点?

Javascript中继承建模的优缺点?,javascript,oop,inheritance,prototype-programming,Javascript,Oop,Inheritance,Prototype Programming,我意识到Javascript没有类,也不是为了有经典的OOP继承而构建的。但我发现这样的模式非常有用,所以我想构建一种简单的方法来建模这种行为,理想情况下,同时利用Javascript的灵活性的最佳部分。以下方法的优缺点是什么 我的自定义库中有以下功能: function inherit(superClass, args, instance) { var subClass = inherit.caller; var o = new superClass(args); fo

我意识到Javascript没有类,也不是为了有经典的OOP继承而构建的。但我发现这样的模式非常有用,所以我想构建一种简单的方法来建模这种行为,理想情况下,同时利用Javascript的灵活性的最佳部分。以下方法的优缺点是什么

我的自定义库中有以下功能:

function inherit(superClass, args, instance) {
    var subClass = inherit.caller;
    var o = new superClass(args);
    for(p in o) {
        if(o.hasOwnProperty(p)) init(instance, p, o[p]);
        else init(subClass.prototype, p, o[p]);
    }
}

function isUndefined(x) {var u; return x === u;}

// sets p to value only if o[p] is undefined
function init(o, p, value) {if(isUndefined(o[p])) o[p] = value;}
此设置需要两个约定:

  • 作为建模类的函数必须具有一个参数:具有命名属性的对象
  • 希望从另一个函数“继承”的函数必须调用继承函数
  • 下面是一个结果示例(与库函数一起粘贴到Firebug命令行,以查看它的实际操作):

    我知道以下缺点:

  • 修改超类原型不会影响实例对象,正如原型样式继承所期望的那样
  • 实例对象将不会注册为超级类的实例(尽管它仍会像一个实例一样嘎嘎作响)
  • 这个论点可能很烦人
  • 优点和优点:

  • 只需要一个函数调用(易于实现)
  • 区分原型属性和实例属性
  • 传递给子类的参数也传递给超类
  • 超级类构造函数设置的实例属性在子类构造函数中立即可用
  • 多重继承很容易,只需在子类中多次调用inherit
  • 不会重写子类的现有属性
  • Pros 3-6特别使此方法比
    SubClass.prototype=new SuperClass()方法对我更有用。其他方法,比如dojo的类建模,要复杂得多,我认为这是不必要的


    那么,告诉我你的想法。如果其他人以前做过,请告诉我,我不打算重复任何想法。

    您可能想看看John Resig在JavaScript继承方面做了什么:


    这是我见过的对Javascript继承的最好尝试。

    你知道你所发布内容的缺点。。。。因此,在我的博客中,我对我认为最好的方式进行了透彻的解释,同时描述了其他模式的缺陷

    例如:

    //Abstraxct base class
    function Animal(name) {
      this.name = name;
    }
    
    Animal.prototype.sayMyName = function () {
      console.log(this.getWordsToSay() + " " + this.name);
    }
    
    Animal.prototype.getWordsToSay = function () {} // abstract
    
    // --------------------------------
    
    function Dog(name) {
      // Call the parent's constructor
      Animal.call(this, name);
    }
    
    extend(Dog, Animal, {
      getWordsToSay: function(){
        return "Ruff Ruff";
      }
    });
    
    我发布的代码是一个示例语法。博客文章详细介绍了如何添加语法糖

    重要的是:

    • 新狗(“小姑娘”)动物实例//正确
    • 调用Animal构造函数不仅仅是为了设置继承
    • var dog=新狗(“Lassie”);Animal.prototype.blah=5;dog.blah==5//输出为真

    来这里看javascript继承的简单且可能是最好的方法的人,请阅读以下内容,它比我浏览过的所有其他内容都要简单得多:

    注意:Object.create现在是较新浏览器中javascript的一部分,但通过添加上述内容,以下内容也适用于较旧的浏览器

    newObject = Object.create(oldObject);
    

    请记住,
    调用者
    是非标准的,访问它会在严格模式下抛出错误ES5M我最喜欢的解决方案是coffeescript!
    if (typeof Object.create !== 'function') {
        Object.create = function (o) {
            function F() {}
            F.prototype = o;
            return new F();
        };
    }
    
    newObject = Object.create(oldObject);