通过内建对象的原型,可以为内建对象拓展一些实用的方法
- 范例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属性