目录
1.instanceof 方法
(1)功能
判断所有引用数据类型,并返回布尔值。
(2)原理
{} instanceof Object // true
判断方法右边构造函数的原型是否在左边对象的原型链上。
(3)代码
function myInstanceof(left, right){
if(typeof left !== 'object' && typeof left !== 'function' || left === null) return false;
let proto = Object.getPrototypeOf(left);
let prototype = right.prototype;
while(true) {
if(!proto) return false;
if(proto === prototype) return true;
proto = Object.getPrototypeOf(proto);
}
}
2.Object.is() 方法
(1)功能
判断两个值是否为同一个值,返回布尔值。
(2)原理
Object.is(+0, -0) // false
一般和===相同,也有特殊情况,如+0与-0不再相等,两个NaN是相等的。
(3)代码
function myIs(value1, value2) {
if(value1 === value2) {
// 都不为0或为符号相同的0时返回true
return value1 !== 0 || 1/value1 === 1/value2;
} else {
// 都为NaN时返回true
return value1 !== value1 && value2 !== value2;
}
}
3.new 方法
(1)功能
创建实例对象并返回该实例对象。
(2)代码
function myNew(func, ...args) {
// 第一步:新建一个对象
let obj = {};
// 第二步:将构造函数的作用域赋给新对象
obj.__proto__ = func.Prototype;
// 第三步:改变this指向,给新对象添加属性方法
let result = func.apply(obj, args);
return typeof result === 'object' ? result : obj;
}