- 写在内置类原型上的方法,实例调用的时候:“实例.xxx()",方法中的this是要操作的实例。
向内置类原型扩充方法:把一些公共的方法扩展到内置类的原型上,调用起来非常的方便。
<script>
Array.prototype.unique=function unique(){
if(!Array.isArray(this)) throw new TypeError('确保操作的是一个数组!');
return Array.from(new Set(this));
}
let arr=[2,3,1,2,3,4,5,2,4,4,5,3];
console.log(arr.unique().sort((a,b)=>a-b));
</script>
- JS中创建值有两种方案:字面量方式、构造函数方式。两者创造出来的值都是所属类的实例。
【 基本数据类型值】:
字面量方式创造出来的是基本类型值
构造函数创造出来的是引用数据类型值
Symbol和BigInt不是构造函数,不能使用new执行来创建值
//字面量方式创造出来的是基本类型值
let n=10; //数值
//构造函数创造出来的是引用数据类型值
let m=new Number(10); //对象
m.toFixed(2);
n.toFixed(2); //浏览器在处理基本类型值调用原型上方法的时候,其实内部也是会把基本类型值变为对象实例模式,再次调用的
【引用数据类型值】:
两种创建方法的结果是一样的
let obj1={};
let obj2=new Object();
new Array(10)是创建一个长度为10的数组
基于内置类的扩展方法-面试题如下:
<script>
const validateNum=function validateNum(num){
num=Number(num);
return isNaN(num)?0:num;
};
Number.prototype.plus=function plus(num){
//this是引用数据类型值(基于call/apply/bind等改变this指向,this可以是基本数据类型的值)
//console.log(typeof this); "object"
//对象+数值:大部分情况都会变为字符出拼接,除{}+num及当前对象有原始值[[PrimitiveValue]]
// +将对象转换为数字,首先调用valueOf方法获取原始值(number/string/boolean/date...),如果有原始值,则直接获取到原始值的结果,并参与到后续的运算中
// +如果没有原始值,则继续调用toString先转换为字符串,后续在基于Number转换为数字
num=validateNum(num);
return this+num;
};
Number.prototype.minus=function minus(num){
num=validateNum(num);
return this-num;
};
let n=10;
let m=n.plus(10).minus(5);
console.log(m); //15
</script>
-
Function.prototype(原型)是一个函数,Object.prototype(原型)是一个对象。
-
函数三种角色:
普通函数(闭包作用域)
构造函数(new、类和实例)
普通对象(键值对)
三种角色没有必然的联系
-
阿里面试题