扩展功能 - 合并两个功能?

时间:2011-09-02 17:15:17

标签: javascript jquery

我现在处于一个新的领域,我有一段时间没有处理过这种事情。

为实例提供Javascript“类”的最佳方法是什么

// In the parent instance
function xyz()
{
    var x = 1;
}

我想在类中设置它,当用户扩展一个类时,我希望它们有效地扩展这个功能。我知道我不清楚,但这是漫长的一天。例如,这是用户的代码。

// In the child instance
function xyz()
{
    var y = 2;
}

合并应该导致:

// In the merged instance
function xyz()
{
    var x = 1;
    var y = 2;
}

我吸错了什么或者提出了错误的问题吗?

4 个答案:

答案 0 :(得分:11)

你不能像在那里描述的那样“合并”函数,但是你可以做的是重新定义一个函数来调用它自己和一个新函数(在原始函数之前或之后)。

var xyz = function(){
   console.log('xyz');
};

var abc = function(){
   console.log('abc');
};

// and, elsewhere, if you want to merge:
var orig = abc;
abc = function(){
    orig.call(this, arguments);
    xyz.call(this, arguments);
};

如果您不关心执行上下文或者被调用函数是无参数的,则不需要包含(this,arguments)。但是为了清楚你想要一个参数化的方法,我可以做些什么。

答案 1 :(得分:8)

您使用jquery标记问题,因此我假设您使用jquery。使用jquery,您可以将对象与jQuery.extend()合并。

var object1 = {
  apple: 0,
  banana: {weight: 52, price: 100},
  cherry: 97
};
var object2 = {
  banana: {price: 200},
  durian: 100
};

/* merge object2 into object1 */
$.extend(object1, object2);

或使用原型链来实现继承。例如:

function a() {
    this.t1 = 1;
    this.sayMyName = function() {
        alert('a');
    }
}
b.prototype = new a;
b.prototype.constructor = b;
function b() {
    this.t2 = 2;
    this.sayMyName = function() {
        alert('b');
    }
}
var obj = new b();
alert(obj.t1); // this would say 1
obj.sayMyName(); // this would say b

答案 2 :(得分:0)

如果我理解正确,您可以尝试重命名原始函数并在新函数中调用它:

// In the parent instance
function xyz()
{
    var x = 1;
}

// In the child instance
var old_xyz = xyz;
function xyz()
{
    var y = 2;
    old_xyz();
}

也适用于类/方法继承:

MyClass.prototype.old_xyz = MyClass.prototype.xyz;
MyClass.prototype.xyz = function () {
    this.old_xyz();
}

答案 3 :(得分:0)

const mergeFunctions = function () {
  let listOfFuncs = []
  for (let func of arguments) {
      listOfFuncs.push(func)
  }
  return function () {
    for (let func of listOfFuncs) {
        func(arguments)
    }
  }
}

let x = function () {
  console.log("hello");
}

let y = function () {
  console.log("world")
}
mergeFunctions(x, y)()
/////////////////////
hello
world