instanceof 和 constructor
判断一个实例是否属于某个构造函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>对象判定</title>
</head>
<body></body>
<script>
// 数据判定: typeof 得到的是数据类型的描述
// 基础数据类型 + 函数('function')
// 复杂数据类型: 数组 + 对象(区分不同构造函数产生的实例)
// instanceof ,语法跟typeof一样, 得到的结果是布尔结果: true是对的, false是错的
// 数据 instanceof 构造函数 : 数据是不是构造函数的实例对象(是不是孩子)
function Student(name, age) {
this.name = name;
this.age = age;
}
// 原型方法: 不要使用箭头函数(里面的this是指向window)
Student.prototype.study = function () {
console.log(this.name + "正在学习");
};
const s = new Student("守约", 20);
// s.study()
function Teacher(name, age) {
// this.name = name
// this.age = age
// 借调
Student.call(this, name, age);
}
Teacher.prototype.work = function () {
console.log(this.name + "正在工作");
};
const t = new Teacher("小马哥", 40);
// t.work()
// 如何区分: s是学生,t是老师呢
// 如果是学生: 调用study ;如果是老师: 调用work
if (s instanceof Student) s.study();
else s.work();
console.log(s instanceof Student); // true
console.log(t instanceof Student); // false
// instanceof: 不够精确, 只要有 血缘关系 即可(原型链: 基于母系)
console.log(s instanceof Object); // true
console.log(s instanceof Function); // false
// 如何精确呢? 找妈妈要爸爸: 原型对象中有一个属性: constructor永远指向构造函数
console.log(s.constructor === Student); // true
console.log(s.constructor === Object); // false
// 总结
// instanceof: 判定血缘关系(原型链即可: 侧面证明了原型链的继承)
// 精确判定: 对象.constructor === 构造函数
</script>
</html>