9

我在不同的文件中有 2 个 BI 对象,现在我想用其他对象扩展第一个对象。

第一个对象

var BI = BI || {};
BI = {
    firstInit: function () {
        console.log('I am first init');
    }
}

其他文件

第二个对象

BI = {
   init: function () {
     console.log('I am init');
   }
}

现在我希望第二个对象也应该包含firstInit。让我知道我可以进一步解释。我正在使用 jQuery。

4

4 回答 4

3

你可以在这里使用 jQuery $.extend

试试下面的代码

var BI = BI || {};
BI = {
  firstInit: function () {
    console.log('I am first init');
  }
}

$.extend(BI, {
  init: function () {
    console.log('I am init');
  }
});

console.log(BI);

这是演示

于 2013-08-02T13:42:50.247 回答
2

开箱即用,您无法通过良好的 x 浏览器支持轻松做到这一点。

但是,jQuery 确实为您提供了一种让对象相互扩展的方法:http: //api.jquery.com/jQuery.extend/

所以你会这样做:

var extended = $.extend({}, BI, {
   init: function () {
     console.log('I am init');
   }
});

第一个参数(空对象,{})意味着BI(第二个参数)的属性和你传入的对象将被合并到新对象中。

为此,我编写了一个小的多态扩展,$.extend它允许您从多个对象进行扩展,后一个项目优先:

mergeObjects = function () {
  // Convert the arguments Array-like object to an actual array
  var args = Array.prototype.slice.call(arguments);

  // Only one item? If we give this to $.extend it'll extend jQuery, which is
  // not the desired result, so let's spit it back verbatim
  if (args.length === 1) {
    return args[0];
  }

  // We need to make sure we're always combining objects starting with a
  // completely empty one
  args.unshift(true, {});
  return jQuery.extend.apply(jQuery, args);
};

因此,您可以使用以下通用属性定义基本模块:

var MyBaseModule.prototype = {
  options: {},
  getOptions: function () {
    return this.options || {};
  },
  setOptions: function (options) {
    this.options = options;
  },
  log: function () {
    // do your logging stuff here
  },
  error: function () {
    // do your error handling stuff here
  }
};

和你的实际模块:

var MyModule = function () {
  // constructor code here
};

var MyModule.prototype = mergeObjects(MyBaseModule, {
  // define your module's methods here
});

...现在 MyModule 已经“继承”了options属性和选项 getter 和 setter。new MyModule您可以使用;实例化新模块

如果你想要一种普通的方式,这篇文章可能会有用

于 2013-08-02T13:42:01.417 回答
0

在 JavaScript 中有两种方法可以做到这一点。一种是使用原型链,另一种是复制方法。在这种情况下,您的两个对象都将对象作为原型,因此您需要复制该方法:

BI2.init = BI1.firstInit;

要复制 JQuery 中的所有方法和属性,请使用 $.extend;

BI2 = $.extend({ init: function () { } }, BI1);
于 2013-08-02T13:42:50.233 回答
0

在 Javascript 中,函数是对象。因此它们可以作为参数传递给函数或分配给其他变量(引用)。

var BI = {
    firstInit: function () {
        console.log('I am first init');
    }
};

var BI2 = {
   init: function () {
     console.log('I am init');
   }
}

// copy the reference of function
BI2.originalFirstInit = BI.firstInit;

// run this function
BI2.originalFirstInit(); // output: "I am first init"
于 2013-08-02T13:55:15.293 回答