01-对象归属判定-instanceof(只要在原型链上)
-constructor(必须是直属关系,不能是继承的血缘关系)
<script>
// 实际开发中:对象是很多的,如果要使用对象的API(原型方法):前提是必须知道是哪个构造函数的对象,才能调用对应的API
// 老师对象
function CreateTeacher(name, age) {
this.name = name
this.age = age
}
CreateTeacher.prototype.teach = function () {
console.log(this.name + '正在上课')
}
// 学生对象
function CreateStudent(name, age) {
this.name = name
this.age = age
}
CreateStudent.prototype.study = function () {
console.log(this.name + '正在学习')
}
let t = new CreateTeacher('小马哥', 30)
let s = new CreateStudent('奥迪', 28)
// t是老师对象:应该调用teach方法
t.teach()
// s是学生对象:应该调用study方法
s.study()
// 问题:如何知道s是学生对象?t是老师对象呢?
function showObject(obj) {
// 调用API:obj可能是老师对象,也可能是学生对象
if (obj instanceof CreateTeacher) {
obj.teach()
} else {
obj.study()
}
}
showObject(t)
// // 判定t是老师对象还是学生对象?如何判断
// console.log(typeof t, typeof s) // typeof不能判定对象(能判定的复杂对象:函数)
// // instanceof
// // 语法:对象 instanceof 构造函数
// console.log(t instanceof CreateTeacher) // true
// console.log(t instanceof CreateStudent) // false
// console.log(t)
// // instanceof特点:讲究血缘关系,只要在原型链上,得到的结果就是true
// console.log(t instanceof Object) // true
// 扩展:精准判定,必须是直属关系,不能是继承的血缘关系:constructor:原型对象里面默认的属性,指向自己的构造函数
console.log(t.constructor === CreateTeacher) // true
// 之所以省略__proto__:利用的就是对象的原型链的继承:对象自己,找上级,上级也没有,找顶级
console.log(t.constructor == Object) // false
// // 总结
// // 1. 判定血缘关系:instanceof(符合原型链)
// // 2. 精准判定:用constructor来判定
// // 未来:几乎所有的变量(都是对象),就需要确保安全使用:需要先判定属于什么对象,然后调用对应的API函数来解决
// if (t instanceof CreateTeacher) {
// t.teach()
// } else {
// t.study()
// }
</script>
注意:
1.instanceof特点:讲究血缘关系,只要在原型链上,得到的结果就是true
2.constructor:原型对象里面默认的属性,指向自己的构造函数.精准判定,必须是直属关系,不能是继承的血缘关系