关于jquery:如何扩展javascript对象?

How to extend javascript objects?

本问题已经有最佳答案,请猛点这里访问。

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

第一对象

1
2
3
4
5
6
var BI = BI || {};
BI = {
    firstInit: function () {
        console.log('I am first init');
    }
}

其他文件

第二对象

1
2
3
4
5
BI = {
   init: function () {
     console.log('I am init');
   }
}

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


您可以在这里使用jquery的$.extend

尝试以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var BI = BI || {};
BI = {
  firstInit: function () {
    console.log('I am first init');
  }
}

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

console.log(BI);

这是演示


开箱即用,如果有好的X浏览器支持,你就不可能这么容易做到。

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

所以你应该这样做:

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

第一个参数(空对象,{}表示BI的属性(第二个参数)和您传入的对象将组合到新对象中。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
};

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
  }
};

以及您的实际模块:

1
2
3
4
5
6
7
var MyModule = function () {
  // constructor code here
};

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

…现在,mymodule已经"继承"了options属性和选项getter和setter。您可以用new MyModule实例化新模块;

如果你想要一个普通的方法,这个帖子可能会有用。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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"

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

1
BI2.init = BI1.firstInit;

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

1
BI2 = $.extend({ init: function () { } }, BI1);