当前位置: 首页 > Web前端 > JavaScript

深入理解JavaScript——JavaScript前言中的秦始皇

时间:2023-03-27 15:48:44 JavaScript

作者在Inheritance发了一个关于原型链关系图的问题。题目出自闫海静面试中的HowtoanswertheJavaScriptprototypechainquestion,当你画完之后,你会有一种看到这张图的感觉。确实,这幅图非常令人费解和难以理解。我们来看看这几段代码ObjectinstanceofObject//trueFunctioninstanceofFunction//trueObjectinstanceofFunction//trueFunctioninstanceofObject//true为什么会这样,谁是Object和Function之间的第一位皇帝,Object。原型,Function.prototype呢?这个话题在知乎上已经讨论过了。JS中是先有Object还是Function?在这里,作者检查谁是第一个出现的。在写万物皆对象时,作者解释说JavaScript中的对象有内置对象,而这些内置对象是在语言内部创建的。这些内置对象就是构造函数,也就是被称为内置构造函数,它们的存在是为了方便开发者编写代码。这些内置的构造函数包括Object,Function,Array,String,Number,RegExp等,因为是构造函数,所以一定属于函数,因为是函数,所以都是Function创建的,因为是Function创建的,所以他们都是Function的实例,也就是StringinstanceofFunction//trueArrayinstanceofFunction//trueFunctioninstanceofFunction//trueObjectinstanceofFunction//true,所以他们的原型链图是因为Function是函数,所以有原型属性。因为函数也是对象,Function也有constructor和[[Prototype]],它的关系图是这样的所以有Function.__proto__===Function.prototype:在原型中,我们讲了原型链,因为每个对象都有是一个[[Prototype]]属性,指向它的原型对象,一层一层,最后指向null。而null的最后一站是Object.prototype无论你是构造函数的原型还是自定义对象的原型,都会先指向Object.prototype,然后Object.prototype会指向nullString.prototype.__proto__===Object.prototype//trueNumber.prototype.__proto__===Object.prototype//trueArray.prototype.__proto__===Object.prototype//trueFunction.prototype.__proto__===Object.prototype//trueObject.prototype.__proto__===null//truevarobj={};vararr=[];functionfunc(){}obj.__proto__===Object.prototype//truearr.__proto__.__proto__===Object.prototype//true//arr.__proto__指向Array.prototypefunc.__proto__.__proto__===Object.prototype//true//func.__proto__指向Function.prototype他们的原型链关系图如下:所以看代码和图,我们知道所有原型继承的来源都在Object.prototype中,Object.prototype对象上的属性将被任何使用值,所以判断类型最准确的方法是Object.prototype.toString.call(source)如果我们把构造函数的来源和原型的来源结合起来,就变成了这样:这个图和那个没有太大区别ObjectLayout的关键在于Object和FunctionObject.prototype的原型之母,任何原型都是从它派生出来的。Function.prototype是构造函数之母,任何构造函数都是由它创建的,包括自己对这两点的理解,回过头来看这道题ObjectinstanceofObject//true//对象是由Function.prototype创建的,Function.prototype的原型对象指向Object.prototypeFunctioninstanceofFunction//true//Function是由Function.prototype创建的ObjectinstanceofFunction//true//Object是由Function.prototype创建的FunctioninstanceofObject//true//Function是由Function.prototype创建的,Function.prototype的原型对象指向Object.prototype注意:构造函数也是实例,找出创建的构造函数和原型他们,你可以理解和总结谁是始皇,无疑Object.prototype才是真正的始皇,任何原型都是从它派生出来的;而Function.prototype仅次于Object.prototype,它是内置构造函数的创造者,任何构造函数都派生自它深入理解JavaScript系列文章--开篇深入理解JavaScript--什么是JavaScript深入理解JavaScript——JavaScript是由什么组成的深入理解JavaScript——一切都是对象深入理解JavaScript——对象(object)深入理解JavaScript——new是做什么的JavaScript——Object.create深入理解JavaScript——复制的秘密深入理解JavaScript——Prototype深入理解JavaScript——继承深入理解JavaScript——JavaScript中的始皇——深入理解JavaScript——instanceof——找祖宗深入理解JavaScript——Function深入理解JavaScript——Scope深入理解JavaScript——this关键字深入理解深入理解JavaScript——call,apply,bindwill深入理解JavaScript——Immediatelyexecutedfunction(IIFE)深入理解JavaScript——Lexicalenvironment深入理解JavaScript——Executioncontextandcallstack深入深入理解JavaScript——ScopeVSExecutioncontext深入理解JavaScript——闭包深入理解JavaScript——防抖与节流深入理解JavaScript——函数式编程深入理解JavaScript——垃圾回收机制——深入理解JavaScript——数组深入理解JavaScript——循环来这里深入理解JavaScript——字符串