在javascript中为预定义对象设置原型

时间:2012-08-30 20:52:42

标签: javascript prototypejs prototype javascript-objects

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

只要我实例化数组,我就想alert('an array was created!')

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

没有“newed”数组,这个词是“实例化的”:

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

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

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

答案 1 :(得分:2)

您可以尝试使用自己的功能覆盖Array。它似乎在执行new Array时有效,但在执行[]时却无效。

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

DEMO:http://jsfiddle.net/DAg9A/

答案 2 :(得分:1)

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

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

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

}

因此,无论何时创建数组,都使用:array.create();

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