7、编写 plus 和 minus 实现如下需求
// anonymous: 匿名函数的名称 // 闭包的作用是防止函数跟全局函数有冲突 // 函数自调方式 // ~ function() {}(); // (function() {})() ~ function anonymous(proto) { // 封装 plus 函数 和 minus 函数 共同部分 // 使用函数表达式方式创建函数是为了保证函数提升和 // 防止在创建函数前调用函数 const checkNum = function checkNum(num) { // 强制转换为 Number 类型 num = Number(num); // 如果 num 不是有效数字 if (isNaN(num)) { // 给 num 赋值为 0 num = 0; } // 返回 num return num; }; // 函数表达式 // 把匿名函数改为具名函数,在全局通过函数名无法访问此函数 proto.plus = function plus(num) { // 在函数内部可以调用此函数 // 调用方式 Number.prototype.plus() // 既不跟外部函数名字冲突 // 又可以通过特殊方式调用 // => this: 要操作的那个数字实例(对象) // => 返回 Number 类的实例,实现链式写法 return this + checkNum(num); }; proto.minus = function minus(num) { return this - checkNum(num); }; }(Number.prototype); let n = 10; let m = n.plus(10).minus(5); console.log(m); // => 15 (10+10-5) // 向 Number 内置类(原型)上扩展方法 // 创建一个数据类型值: // 1.字面量方式 // 2.构造函数方式 // 不论哪一种方式,创建出来的结果都是所属类的实例 // => 基本数据类型两种创建方式是不一样的: 字面量创建的是基本类型值, // 构造函数方式创建的是引用类型值 // let x = 10; // 字面量方式 // let y = new Number(10); // 构造函数方式 // console.log(y.valueof() === x); // => 对象结果的原始值是基本类型数字 10