Math.prototype 出错的原因

作者:vkvi 来源:ITPOW(原创) 日期:2009-6-12

如果我们想用 Math.prototype.functionName 来扩展 Math 方法,将会出错。

IE 报如下错:

'Math.prototype' 为空或不是对象

Firefox 报如下错:

错误: Math.prototype is undefined

Chrome 报如下错:

Uncaught TypeError: Cannot set property 'functionName' of undefined

为什么呢?

我们见过 new Date()、new String() 这些用法,没有见过 new Math() 这种用法,说明 Math 没有构造函数 Math(),所以不能对其用 prototype,因为 prototype 是构造函数的属性。

怎么办呢?

Math 的属性、方法都是静态的,比如 Math.PI、Math.min、Math.max 等等都是静态的。我们扩展 Math 也只能扩展为静态的属性和方法。

Math.MAXBYTE = 256;
alert(Math.MAXBYTE);

Math.sum = function (m, n)
{
    return m + n;
}
alert(Math.sum(1, 2));

扩展内容

如果 typeof(对象.prototype) 结果为 undefined,则说明不能使用 prototype。

除了上述方法,在 Firefox、Chrome 中还可以用 __proto__,比如 Math.__proto__.MAXBYTE,Math.__proto__.sum。在创建对象时,会自动将 __proto__ 属性分配给所有对象。解释程序使用 __proto__ 属性来访问对象的类或构造函数的 prototype 属性,以便弄清楚该对象从其超类中继承了什么属性和方法。由于 Math 对象没有构造函数,所以 prototype 属性不可用,但 __proto__ 可用。要说明的是 IE 中不支持 __proto__,所以还是像前面示例中的直接加属性和方法比较好。

相关文章