你尚未登录,仅允许查看本站部分内容。请登录使用邀请码注册
singsong

如何更好修改(增加)原生对象的原型 1个回复 专栏 @ Javascript

singsong 发布于 2 年前

这里修改是为原生对象的原型添加属性。

增加内置构造函数(如Object(),Array()和Function()等)的原型是很有诱惑的,但是这样做可能会让维护变得更加困难,代码变得更加不可预测。如果 某个实现中缺少某个方法,就在原生对象的原型中添加这个方法,那么当在另一个支持该方法的实现中运行代码时,就可能会导致命令冲突。而且这样做可能会意外地重写原生方法。
此外,给原型添加的属性在没有使用hasOwnProperty()时可能会在循环中出现,即在原型添加的属性hasOwnProperty()是返回false,这会导致一些混乱。

因此,最好的方法是不要给原生对象的原型添加属性。不过以下情形可以为原生对象的原型增加属性:

  1. 当未来的ECMAScript版本或JavaScript的具体实现可能将该功能作为一个统一的内置方法时。如可以添加ECMAScript5中描述的方法,并等待浏览器来对其的支持。在这种情形下,仅仅是提前定义了有用的方法。
  2. 如果检查了自定义的函数或方法并未存在时。也许在其他地方已经实现了该方法,或是某个你支持的浏览器中JavaScript引擎的一部分。
  3. 你准确地用文档记录下来,并和团队交流清楚。
如果遇到上述情形,可以采用如下模式来为原生对象的原型增加自定义的方法:
if (typeof Object.prototype.myMethod !== 'function') {
    Object.prototype.myMethod = function() {
        // implementation....
    };
}
//假如String不支持trim()方法
if (typeof String.prototype.trim !== 'function') {
    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, '');
    };
}
另外我们还可以使用【寄生构造函数模式】来间接的为原生对象添加我们需要的方法:
//该模式是通过重新封装来实现的
function SpecialArray () {
var arr = new Array();
arr.push.apply(arr, arguments);
//添加自定义的方法
arr.customToString = function() {
return this.join(' ');
};
//返回
return arr;
}
//调用
var sarr = new SpecialArray('this', 'is', 'a', 'array');
console.log(sarr.customToString());
//运行结果
this is a array
[Finished in 0.4s]

也可以通过原型式继承来封装

//检测是否支持Object.create方法
if(typeof Object.create !== 'undefined') {
Object.create = function(obj) {
 function F(){};
 F.prototype = obj;
 return new F();
};
}

function SpecialArray () {
var arr = Object.create(Array.prototype);
arr.push.apply(arr, arguments);
arr.customToString = function () {
return this.join('|');
};
    return arr;
}
//调用
var sarr = new SpecialArray('this', 'is', 'a', 'array');
console.log(sarr.customToString());
//运行结果
this|is|a|array
[Finished in 0.4s]
登录后回复,如无账号,请使用邀请码注册