通过内建对象的原型,可以为内建对象拓展一些实用的方法

  • 范例1 —— 检测指定元素是否在数组中 inArray()
Array.prototype.inArray = function(needle) {
for (var i = 0, len = this.length; i < len; i++) {
if (this[i] === needle) {
return true;
}
}
return false;
};

> var colors = ['red', 'green', 'blue'];
> colors.inArray('red');
true

> colors.inArray('yellow');
false
  • 范例2 —— 字符串反转 reverse()
String.prototype.reverse = function() {
return Array.prototype.reverse.apply(this.split('')).join('');
};

> "bumblebee".reverse();
"eebelbmub"

js 内建对象拓展的使用场景

让老式浏览器支持已被ECMAScript委员会标准化了的、为现代浏览器所实现的新功能,例如让旧版IE支持ES5中的方法,通常这类扩展叫作shim或者polyfill。

重要提醒:

尽可能的避免使用这项技术,避免引发js内建对象的功能混乱,特别是对于代码的维护者很不友好,容易导致无法预期的错误!

如果想要通过原型为某个对象添加一个新属性,务必先检查一下该属性是否已经存在。

js 判断对象的属性是否存在

1.in运算符 (属性名 in 对象)

  • 情况1——对象自身属性
var obj={a:1};
"a" in obj//true
  • 情况2——对象继承的属性
var objA={a:1};
var objB=Object.create(A)
"a" in objB //true

总结:in运算符不仅能识别对象自身的属性 也能识别继承的属性

2. hasOwnProperty 只能识别对象自身的属性

var obj={a:1};
obj.hasOwnProperty("a")//true

obj.hasOwnProperty("toString")// false obj 本身没有toString属性