内置类的原型上扩展方法

本文要点:
内置类的原型上扩展方法:

  1. 内置类的原型上会默认存在很多常用的方法
    Array.prototype / String.prototype / Object.prototype … 这些方法实例都可以调用,但是内置的方法不一定能满足所有的开发需求,有很多方法需要自己来编写
 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);

  1. 向原型上扩展的方法,调用起来比较的方便
    实例.方法()
    方法执行的时候,方法中的THIS就是当前处理的实例
    1)扩展的方法名字最好设置前缀,例如:Myxxx,防止自己扩展的方法替换了内置的方法
String.prototype.indexOf = function indexOf() {
	return 'OK';
};
console.log(url.indexOf('?'));//只是输出'ok',所以最好写成String.prototype.myIndexOf 

2)THIS的结果一定是对象数据类型值,所以向基本数据类型的原型上扩展方法,方法被执行的时候,方法中的THIS不再是基本类型,但是还按照原始的方法处理即可(因为在运算的时候,会隐式调用对象的valueOf方法,返回它的原始值,而原始值就是之前的基本数据类型值)
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) {
	console.log(key);
} 
//输出结果:name age AAA

for (let key in obj) {
	// 在遍历的时候,对于原型上扩展的公共属性方法,我们过滤掉,只遍历对象中私有的属性方法(必须是可枚举的)
	if (!obj.hasOwnProperty(key)) break;
	console.log(key);
} 
//输出结果:name age
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值