对象归属判定`instanceof`-`constructor`/

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:原型对象里面默认的属性,指向自己的构造函数.精准判定,必须是直属关系,不能是继承的血缘关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值