一个重要的内置关系
VueComponent.prototype.proto===Vue.prototype
对象的原型就是__proto__隐式原型属性
构造函数的原型就是prototype显式原型属性,显式原型属性只有函数才可以拥有
原型对象也有对象,对象也有原型,也就是__proto__
当我们编写组件标签的时候,vc也就是VueComponent的实例,vc就是一个对象,身上就有__proto__ ,__proto__表示的就是VueComponent的原型对象,而VueComponent的原型对象也是一个对象,也有__proto__属性,指向的就是Vue的原型对象。
那么,有了以上的知识基础,可以看一下这题。
请你编写一个函数,检查给定的值是否是给定类或超类的实例。
可以传递给函数的数据类型没有限制。例如,值或类可能是 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)
运行结果: