讲一下你对js原型对象的了解?
问题
1.什么叫原型对象?什么叫做原型链?
2.instanceof和原型链有什么关系?
3.Function是最顶层的构造器,Object是最顶层的对象,这句话中的“顶层”,是如何在原型链中体现出来的?
4.es6中的class的本质?\
1.什么叫原型对象?什么叫做原型链?
var obj = {}
var arr = []
function f(){}
console.log(obj.__proto__)
console.log(arr.__proto__)
console.log(f.__proto__)
console.log(obj.prototype)//undefined
console.log(arr.prototype)//undefined
console.log(f..prototype)//有值
什么叫原型对象?
在js中,对象分为普通对象和函数对象, 而obj、arr属于普通对象,f属于函数对象, 我们打印obj,arr,f都能看到,__proto__这个属性都存在于这个这个三个对象当中,而打印prototype这个属性的时候,只有f有这个值,obj和arr都没有
所以prototype这个属性只存在于函数对象当中,普通对象没有,而我们一般把__proto__成为谁谁的原型,比如obj的原型对象,f的原型对象
其中,__proto__为隐式原型,prototype为显示原型
什么叫做原型链?
var obj = {}
obj.__proto__.__proto__.test = "测试"
obj.test
我们知道,因为obj._proto__他也是一个对象,根据每个对象都有__proto__属性,所以,obj.proto__里面还有__proto。但是,如果这样: obj.proto...proto,可以这样一直点__proto__点下去吗?__proto__一直嵌套下去,循环下去?
其实打印就知道,你在obj最后一个__proto__就可以看到,他啥都没了,只剩个null,而这里就是尽头,而当你在寻找obj中test这个属性的时候,其实他这个路径是这样的:
obj.test -> obj.proto.test -> obj.proto.proto.test
他会一直不断的从他的__proto__里面去找这个属性直到找到为止,如果他到了近头的__proto__也找不到,就是找不到了,返回undefined,而他寻找的这个路径,就是传说中的原型链
2.instanceof和原型链有什么关系?
instanceof 主要的作用就是判断一个实例是否属于某种类型,比如:
[] instanceof Array //true,说明[]是Array类型
f instanceof Function //true,说明f是Function类型
f1 instanceof f //true,说明f1是f类型(f1是f的实例)
Array.prototype.__proto__===Object.prototype//true 说明Array.prototype是Object类型
Array.prototype.__proto__ === Function.prototype//false 说明Array.prototype不是Function,就是说,Array.prototype是一个对象,而不是一个函数
Object.__proto__ === Function.prototype //true 说明Object是Function的类型
Array.__proto__ === Function.prototype //true 说明Array是Function的类型
[].__proto__ === Array.prototype //true 说明[]是Array的类型
[].__proto__ === Function.prototype //false 说明[]不是Function的类型
Function.__proto__ === Function.prototype //true 说明Function是Function的类型
而instanceof主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可
function MyInstanceof(L, R) {
L = L.__proto__; while (true) {
if (L === null) return false;
if (L === R.prototype) return true;
L = L.__proto__;
}}