__proto__ & prototype

127 阅读2分钟

一个重要的内置关系

VueComponent.prototype.proto===Vue.prototype

对象的原型就是__proto__隐式原型属性

构造函数的原型就是prototype显式原型属性,显式原型属性只有函数才可以拥有


原型对象也有对象,对象也有原型,也就是__proto__

当我们编写组件标签的时候,vc也就是VueComponent的实例,vc就是一个对象,身上就有__proto__ ,__proto__表示的就是VueComponent的原型对象,而VueComponent的原型对象也是一个对象,也有__proto__属性,指向的就是Vue的原型对象。

image.png


那么,有了以上的知识基础,可以看一下这题。

**[2618. 检查是否是类的对象实例]

请你编写一个函数,检查给定的值是否是给定类或超类的实例。

可以传递给函数的数据类型没有限制。例如,值或类可能是  undefined 。

有直接实现的函数:instanceof

使用instanceof可以检查一个对象是否是一个类的实例

语法:对象 instanceof 构造函数

如果是,则返回true,否则返回false

function person (name, age) {
		this.name = name
		this.age = age
}
		var o = new person('jack', 23)
console.log(o.__proto__=== person.prototype)//true
console.log(o instanceof person)//true

手写实现instanceof

判断是否是类的实例对象的情况有:

  • 没有原型 -false
  • 不是类的实例对象 -false
  • 是类的实例对象 -true
  • 是类的实例的实例的..的对象 -true
var checkIfInstanceOf = function (obj, classFunction) {
            if (
                obj === null ||
                obj === undefined ||
                classFunction === null ||
                classFunction === undefined
            ) {
                return false
            }
            // 实例原型存在 且 实例的原型 不等于 对象的原型
            // 判断obj原型链上的所有隐式原型,是否等于classFunction.prototype
            // 如果相等则返回true,不等则让obj = obj.__proto__,继续判断原型的原型
            while (obj.__proto__ && obj.__proto__ != classFunction.prototype)
                obj = obj.__proto__;
            return obj.__proto__ === classFunction.prototype;
        }

        function person (name, age) {
            this.name = name
            this.age = age
        }
        var o = new person('jack', 23)
				console.log(checkIfInstanceOf(o, person))
        console.log(o instanceof person)

运行结果:

image.png