0

如何操作prototype预定义对象(例如 an Array)的 ,以便在创建该对象的实例时执行某些操作?

alert('an array was created!')只要实例化一个数组,我就想这样做。

4

3 回答 3

3

您可以通过将数组添加到Array.prototype对象来在数组上设置新方法:

Array.prototype.fizz = function () {
    alert('works');
};

var arr = [];
arr.fizz();

但是,这只允许您创建新方法,不允许您扩展现有方法*,也不允许您覆盖Array构造函数。

向现有类型添加新方法时要小心。这会对整个脚本环境产生不利影响,并导致某些库出现意外行为。尽管有些人可能会称其为“不好的做法”,但使用 polyfills 来实现跨浏览器兼容性是很常见的,例如通过创建Array.prototype.indexOf.

没有“新”数组之类的东西,这个词是“实例化的”:

var a1, a2;
a1 = []; //a1 was instantiated with a new Array
a2 = new Array(); //a2 was also instantiated with a new Array

没有覆盖Array构造函数的跨浏览器方法。

* 可以将现有方法包装在函数中,以便在调用时,现有方法除了执行新功能外,还执行其原始功能。尽管这可能被称为扩展现有方法,但实际上是在创建新方法。

于 2012-08-30T20:57:58.537 回答
2

您可以尝试Array使用自己的功能覆盖。它似乎在做的时候起作用new Array,但在做的时候却不起作用[]

(function() {
    var _ac = Array;
    Array = function() {
        alert('an array was newed!');
        return _ac.apply(this, arguments);
    };
}());

演示:http: //jsfiddle.net/DAg9A/

于 2012-08-30T21:00:48.503 回答
1

我建议你为它创建一个数组命名空间:

array = {};
array.create = function() {

    alert("Created an array");     
    return [];

}

所以每当你创建一个数组时,你都会使用:array.create(); .

您不应该并且在这种情况下也不能更改本机功能。您必须负责每个数组的创建。

于 2012-08-30T21:06:03.060 回答