JavaScript_proto_和prototype到底是什么玩意
今天去逛了贴吧,发现有人在问instanceof
的类型比较,所以比较贴心的去解释了一下,instanceof
是比较左侧的_proto_
和右侧的prototype
是否相同,当然因为js所有的对象啊,方法,都会有_proto_
这个属性,所以会一直循环下去,直到摸到顶层,也就是object.prototype._proto_
结束。
结果呢,吧友表示不能理解,那
_proto_
和prototype
到底有什么区别啊?是个什么东西啊?
在这里我头也比较大啊,小学语文没学好,所以组织能力比较差劲,所以尽量的咱用代码来解释吧。
function too() {
this.t = 0;
}
var t = new too()
console.log(t._proto_)
console.log(too.prototype)
看了输出以后,都能惊奇的发现,输出的是同一个东西,一个是万物皆有的proto,还有一个就是自身的构造,
也就是说,_proto_
这个属性的意思是,去指向自己的父亲创造自己时用的构造方法。
而prototype
这个属性的意思就是,我自己生孩子(创建对象)的时候用的构造方法。
看起来有点绕来绕去的,其实说白了就是一个找爸爸怎么创建自己,一个找自己怎么创建儿子,两种东西,所以_proto_
这属性能一直往上摸上去,找自己的爸爸的爸爸,爸爸的爸爸的爸爸。
那么我们来简单的试验一下,按照刚才的代码,我用function
去创造了too这个对象,而用too的too()这个构造方法,去创建了t这个对象,所以关系是function生了too,too生了t,然后我们在用instanceof
去比较一下三者的关系。
console.log(t instanceof too) //true
console.log(too instanceof Function) //true
console.log(t instanceof Function) //true