1

我正在尝试使用 jquery 扩展来模拟继承,但据我所知,它仅适用于对象。

我想要完成的是:

var baseDefinition = function() {
    var self = this;

    self.calc1 =  function() {
        return "something1";
    }

    self.calc2 =  function() {
        return "something2";
    } 

    self.myObject = {
        propA = 100;
        propB = 200;
    };
}

var derivedDefinition = function() {
    var self = this;

    self.calc2 =  function() {
        return "something different from base";
    }

    self.myObject = {
        propB  = 400;
    };            
}

var instance = $.extend(true, {}, baseDefinition, derivedDefinition);

因此,我希望从基本定义创建一个新实例,其中派生定义将应用于基本定义,但两个定义都不会被“触及”。可能吗?

我希望避免任何原型,所以基本上我想在不知道它是否被覆盖的情况下调用 instance.calc1 或 instance.calc2。

编辑:

在我的示例中,我没有包含任何导致我使用 jquery 扩展功能的对象属性。尽管两个答案都解决了内部函数“继承”,但它(显然)没有像 extend 那样合并对象属性。作为一种可能的解决方案,我在创建实例以循环遍历实例的属性并在它们上应用 jquery 的扩展后正在考虑。尽管这对我来说似乎效率低下,但我不知道您是否可以就另一种行动方案给我建议。

4

2 回答 2

4

JQuery 扩展不会创建继承层次结构,因此您在扩展之后对基本定义所做的更改不会反映在派生定义中。以下是如何扩展基本定义的方式,以反映以后使用 Javascript 原型继承对继承层次结构的更改:

var baseDefinition = function() {};

baseDefinition.prototype.calc1 =  function() {
    return "something1";
};

baseDefinition.prototype.calc2 =  function() {
    return "something2";
};   


var derivedDefinition = function() {};

derivedDefinition.prototype = Object.create(baseDefinition.prototype);

derivedDefinition.prototype.calc2 =  function() {
    return "something different from base";
};

var instance = new derivedDefinition();
instance.calc1();  // something1
instance.calc2();  // something different from base
于 2013-07-30T23:08:25.613 回答
1

$.extend仅适用于已经存在的对象,不适用于将在(远?)未来实例化对象的函数:

var instance = $.extend(true, {}, new baseDefinition(), new derivedDefinition());

但是,您当然可以设计一个extend适用于构造函数并返回函数的函数:

function extendConstr() {
    var fns = arguments;
    return function newConstr(){
        var self = {};
        for (var i=0; i<fns.length; i++)
            fns[i].apply(self, arguments);
        return self;
    }
}

var extendedFunction = extendConstr(baseDefinition, derivedDefinition);

var instance = extendedFunction();
console.log(instance); // has `calc1` and overwritten `calc2`

顺便说一句,如果没有extend函数,您可以在派生构造函数中手动完成:

function derivedDefinition() {
    baseDefinition.call(this/*, arguments */);

    this.calc2 =  function() {
        return "something different from base";
    }
}
console.log(new derivedDefinition) // has a `calc1` as well
于 2013-07-30T22:55:44.527 回答