本文有点混杂,包括:
全文与面向对象的对象有关。感兴趣的学生可以在深度理解中理解。当然,这并不是所有面向对象的知识点。我会在以后的文章中慢慢为您带来更多面向对象的知识。如果您觉得自己的基础相对较弱,这也取决于它。看着我以前的“前端基石”文章,它是前端的基本知识。
门户网站
数组构建-in构造函数使用数组函数作为“普通对象”。设置设置的“私有静态属性和方法”无关紧要。通常,写了一些工具方法,例如array.from,array.isarray,array.of,array.of ...
Array.Prototype原型将数组视为“构造函数”,其“原型对象”上设置的公共属性和方法用于机构,例如Array.xxx()或Array.prototype.xxx()。
function.prototype是一个匿名函数,其余构造函数的原型对象是普通函数。尽管它是一个函数,但它与其他原型对象操作相同。和所有功能“常规函数,自定义函数,构建的 - 在结构函数,箭头函数”是构建函数-in类的实例。
所有对象“普通对象,函数对象,特殊对象,实例对象,原型对象”都是构建的对象。
function.protype ==== function.proto:function(function)是函数类的实例
function.proto.proto === object.protype:function(object)是对象类的实例
function.prototype.proto === object.protype:function.prototype(原型对象)是对象类的实例
object.proto === function.protype:object(function)是函数类的实例
object.proto.proto ==== object.protype:object(object)是对象类的实例
array.proto.proto === object.protype:array(object)是对象类的实例
Em
无论如何,将在最后找到对象。对象是所有对象类型的“基类”。所有对象的原型最终都将停止在object.protype上。
当遇到这样一个主题时,我个人认为我开始想到脑海中的大脑绘画,并清楚地理解它们之间的链接和关系。根据“初始化”的上诉代码,大脑绘画如下。这里有两点要注意:
根据大脑图,代码“ foo.getName()”以普通对象的形式启动foo,查询foo的私有属性和原型链上的getName方法,并发现私有属性本身存在于getName属性中,所以您不需要在原型链链查询上的原型链上,输出结果“ 2”。
getName()执行,并且方法前面没有修改,然后执行全局getName。在EC(g)查询中,是否有方法getName,找到全局方法,输出结果为“ 4”。
foo()。getName()执行,首先执行foo作为普通方法,然后将getName返回回返回结果。foo方法输入堆栈,请按照常规步骤操作:
getName()执行,方法前面没有修改,然后执行全局getName。在EC(g)中,查询是否有一个方法getName,找到一个全局方法,并且在上一步中重新分配了getName,执行输出结果“ 1”“ 1” ESSENCE
new foo.getName(),new foo()。getName()执行。由于优先级不同,两个执行顺序非常不同。newfoo.getName()=> new(foo.getName()),new foo()。getName()=>(new foo())。getName()。
这里的主要关注是不同的:new foo,没有参数new.new foo()具有新的参数。它们都执行foo并创建foo类别,但是两者的优先级具有不同的优先级,具有参数18和无参数17.Members 17.Members。访问18。
new(foo.getName()))首先在foo对象上找到getName以执行,然后结果是新的,因此结果为“ 2”。
(new foo())。getName()创建一个foo实例,然后执行getName方法。该实例本身没有getName方法。查询通过原型链查询。
新的foo()。getName()执行,此行代码实际上是上面两个的组合。新foo()。getName()=>新实例.getName()=>新结果。最终结果为“ 3”。
它用于检测属性是否是私人属性,以及它是否是私有属性实际上是一个相对概念。一堆内存中的属性是私有属性,基于原型链(Proto)的公共属性是“相对于自己的”。例如:
执行推送方法时:您将首先检查您的私有属性是否具有按下方法,并发现ARR对象上没有推动方法,那么默认值是用于搜索的原始方法。首先要查找的是array.prototype.push方法执行,将新内容30添加到ARR的末尾,然后让阵列长度+ 1返回新的数组长度。这是推送的内部执行策略。如果我们我们使用object.prototype.hasownproperty检测是否存在某个对象上的推动属性,将使用“私有属性相对”功能。
为了推动ARR对象,它是基于proto找到的。首先要找到的是array.protype。发现与ARR相比,PUSH是“公共属性”。
推送在array.protype中存在,并且不需要通过原型链找到。推动是相对于array.protype的私有属性,因为它在array.protype的对象上。
检查该属性是否属于某个对象,是公共还是私有对象。只要您可以访问此属性,结果就为真。
我在此处的小组中看到了一个面向基本面孔的基本面孔面向的问题。
根据上面的对象。prototype.hasownproperty,该属性用于检测属性是否是私人属性,该属性是否属于某个对象,无论是私有属性,它是私有的还是私有的。方法:
它是对象的属性,但不是一个私人属性,必须是公共属性。实际上,根据这个想法没有问题吗?,这种方法将不起作用。例如:我们检查的“ tostring”的属性存在于公众原型中,并且私有一切也存在。在这种情况下,上述实现存在问题。
如果要正确实施。如果您想确认属性是公共属性,但是您无法在自己的私人所有权中检查它。唯一的方法是跳过搜索私人属性,直接检查公共属性是否存在。但是查询的属性无法确认原型链上的特定位置位置。目前,您需要逐层慢慢查询,直到找到它为止。
实际上,还有另一种简单的方法:
据说这是一个面试问题。
简单地说,您需要自己手动实现一种新方法。手动实现实现的新方法可以与普通的新功能一致。如果您想手动实现新的,首先知道新本身的实现机制。在上一篇文章中已经提到了“建设性函数和普通函数之间的差异”。
一般函数执行:
构建功能执行:
有必要意识到新本身实际上是基于这三个点的。
这样,基本上实现了一种新方法,但是有一些小问题。当我们正常使用新功能时,并非所有功能都可以是新功能,箭头功能,sybmol或bigint。
因此,当我们自己实施_new方法时,我们还需要排除这些情况,以确保与普通新功能相同。
为了创建一个空对象并将原型指向构造函数的原型,我们有各种实现方法。
原始
在许多浏览器(例如IE(Edge)除外)等许多浏览器中不允许原始访问原型,因此存在兼容性问题。
object.setPrototypeof
object.setPrototypeof()方法将对象的指定对象(即内部[[[protype]]属性)设置为另一个对象或null。setPrototypeof的兼容性相对更好。
警告:由于现代JavaScript引擎的优化属性访问的特性之间的关系,对象的[原型]在每个浏览器上是一个非常缓慢的操作,而JavaScript引擎对继承性能的影响是微妙而广泛的,这不仅限于obj.proto = ...在句子上花费的时间,但可以扩展到任何代码。这些可以访问已更改的任何[[[原型]]]]。如果您关心性能,则应避免设置对象[[Prototype]]。相反,您应该使用Object.Create()创建一个新对象使用[[[原型]]]。
对象。创建
Object.Create()方法创建一个新对象,使用现有对象提供proto.object.create的兼容性的新对象,与上述两种方法相比是最好的。
面向对象是前端相对较大的知识点,还有更多细节。在这里,一篇文章无穷无尽。如果您对物体感兴趣,则可以注意我的下一篇“前端基石”文章。如果您对前端基金会感兴趣。您可以阅读我以前的“ Front -End Cornerstone”文章。如果您认为本文对您有帮助,请喜欢,谢谢。
原始:https://juejin.cn/post/7101584781334462471