
我们知道,JavaScript中的内建对象分为以下三种:
-
数据封装类对象——包括Object, Array, Boolean, Number和String。
-
工具类对象——包括Math, Date, RegExp等用于提供便利的对象。
-
错误类对象——包括一般性错误对象以及其他各种更特殊的错误类对象。
以上对象,都可以通过其原型来进行扩展,比如添加一些自定义的方法。
我们以扩展Array对象来举例,在Array对象中自定义shuffle()方法,实现随机打乱数组的功能。代码如下:
Array.prototype.shuffle = function () {
var temp_arr_1 = new Array();
for (var i = 0; i < this.length; i++) {
temp_arr_1[i] = i;
}
var temp_arr_2 = new Array();
for (var i = 0; i < this.length; i++) {
temp_arr_2[i] = temp_arr_1.splice(Math.floor(Math.random() * temp_arr_1.length), 1);
}
var temp_arr_3 = new Array();
for (var i = 0; i < this.length; i++) {
temp_arr_3[i] = this[temp_arr_2[i]];
}
return temp_arr_3;
}
这时我们就已经实现了扩展内置对象。可是...
我们似乎遗漏了点什么——如果我们自定义的方法与浏览器内存在同名内建方法时,该怎么办?这个时候我们希望可以直接调用原生方法,避免方法的覆盖。于是,我们需要在自定义方法之前加一句判断,修改一下代码:
if (typeof Array.prototype.shuffle !== 'function') {
Array.prototype.shuffle = function () {
var temp_arr_1 = new Array();
for (var i = 0; i < this.length; i++) {
temp_arr_1[i] = i;
}
var temp_arr_2 = new Array();
for (var i = 0; i < this.length; i++) {
temp_arr_2[i] = temp_arr_1.splice(Math.floor(Math.random() * temp_arr_1.length), 1);
}
var temp_arr_3 = new Array();
for (var i = 0; i < this.length; i++) {
temp_arr_3[i] = this[temp_arr_2[i]];
}
return temp_arr_3;
}
}
如此,我们便达到了通过原型扩展内建对象的目的。
网友评论