前言:锻炼自己的思想,规范自己的编程思路。
问题:
请你编写一个函数,检查给定的值是否是给定类或超类的实例。
可以传递给函数的数据类型没有限制。例如,值或类可能是 undefined 。
示例:(放代码里面)
输入:func = () => { class Animal {}; class Dog extends Animal {}; return checkIfInstance(new Dog(), Animal); }
输出:true
解释:
class Animal {};
class Dog extends Animal {};
checkIfInstanceOf(new Dog(), Animal); // true
Dog 是 Animal 的子类。因此,Dog 对象同时是 Dog 和 Animal 的实例。
思路:
题目给出的函数名为 checkIfInstanceOf 的函数,它用于检查给定的值 obj 是否是给定类 classFunction 或其超类的实例。
函数接受两个参数:obj 是要检查的值,classFunction 是要检查的类。
函数首先检查 obj 和 classFunction 是否为 null 或 undefined,如果是,则返回 false。
接下来,函数使用一个循环来遍历 obj 的原型链。在每次迭代中,函数检查 obj.__proto__是否等于 classFunction.prototype。如果是,则返回 true。否则,将 obj 设置为其原型对象,并继续循环。
如果循环结束后仍未找到匹配的原型对象,则返回 false。
需要注意的是,这段代码使用了非标准的 proto 属性来访问对象的原型。这个属性并不是所有浏览器都支持的,因此不建议在生产环境中使用。如果你想要访问对象的原型,可以使用标准的 Object.getPrototypeOf() 方法。
基于上述思考,代码如下:
/**
* @param {any} obj
* @param {any} classFunction
* @return {boolean}
*/
var checkIfInstanceOf = function(obj, classFunction) {
if (obj === null || classFunction === null || obj === undefined || classFunction === undefined) {
return false;
}
while (obj.__proto__ !== null) {
if (obj.__proto__ === classFunction.prototype) {
return true;
} else {
obj = obj.__proto__;
}
}
return false;
};
/**
* checkIfInstanceOf(new Date(), Date); // true
*/
执行结果如下图:
学到的知识:
instanceof 是 JavaScript 中的一个二元运算符,用于检查一个对象是否是一个类的实例,或者是否是该类的超类的实例。它返回一个布尔值,表示测试结果。