内置类的原型上扩展方法:
-
- 内置类的原型上会默认存在很多常用的方法
-
Array.prototype / String.prototype / Object.prototype ... 这些方法实例都可以调用,但是内置的方法不一定能满足所有的开发需求,有很多方法需要自己来编写
-
- 向原型上扩展的方法,调用起来比较的方便
-
实例.方法() -
方法执行的时候,方法中的THIS就是当前处理的实例 -
1)扩展的方法名字最好设置前缀,例如:Myxxx,防止自己扩展的方法替换了内置的方法 例: String.prototype.indexOf = function indexOf() { return 'OK'; }; console.log(url.indexOf('?')); 此时就把原有的方法覆盖了 -
2)THIS的结果一定是对象数据类型值,所以向基本数据类型的原型上扩展方法,方法被执行的时候,方法中的THIS不再是基本类型,但是还按照原始的方法处理即可(因为在运算的时候,会隐式调用对象的valueOf方法,返回它的原始值,而原始值就是之前的基本数据类型值) 例: String.prototype.queryURLParams = function queryURLParams(key) { // this -> 当前要处理解析的URL let obj = {}; this.replace(/([^?&=#]+)=([^?&=#]+)/g, (_, $1, $2) => obj[$1] = $2); this.replace(/#([^?&=#]+)/g, (_, $1) => obj['_HASH'] = $1); return typeof key === "undefined" ? obj : obj[key]; }; let url = "http://www.zhufengpeixun.cn/?lx=1&from=wx#video"; let result = url.queryURLParams(); console.log(result); -
3)如果返回的结果依然是当前类的实例,还可以继续调用当前类原型上其它的方法(如果不是自己类的实例,可以掉用其它类原型上的方法) => “链式写法” 例: (function () { function handleNum(num) { num = Number(num); return isNaN(num) ? 0 : num; } Number.prototype.plus = function plus(num) { num = handleNum(num); return this + num; }; Number.prototype.minus = function minus(num) { num = handleNum(num); return this - num; }; })(); let n = 10; let m = n.plus(10).minus(5); console.log(m); //=>15(10+10-5) -
3.对于一个对象来说,它的属性方法(私有的/公有的)存在“枚举”的特点:在FOR IN循环的时候是否可以遍历到,能遍历到的是可枚举的,不能遍历到的是不可枚举的【内置类原型上自己扩展的方法是可枚举的】 例: // obj.proto=Object.prototype; // AAA是可枚举的属性了 Object.prototype.AAA = function AAA() {}; let obj = { name: 'zhufeng', age: 11 }; for (let key in obj) { // 在遍历的时候,对于原型上扩展的公共属性方法,我们过滤掉,只遍历对象中私有的属性方法(必须是可枚举的) if (!obj.hasOwnProperty(key)) break; console.log(key); }