如何扩展JavaScript对象?

这个问题在这里已经有了答案:

  • 我如何动态合并两个JavaScript对象的属性? 55个答案

  • 你可以在这里使用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);
    

    这是DEMO


    开箱即用,您无法通过良好的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实例化新模块;

    如果你想要一个香草的方式,这篇文章可能会有用


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

    BI2.init = BI1.firstInit;
    

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

    BI2 = $.extend({ init: function () { } }, BI1);
    
    链接地址: http://www.djcxy.com/p/27341.html

    上一篇: How to extend javascript objects?

    下一篇: JSON to JSON Copy based on Keys