在JS的学习中,原型无疑是一个困难的一点,但它也是一个不容忽视的焦点。在前端访谈中,这也是一次高频测试。在下一项研究中,您会发现诸如原型和原型链之类的知识点并不困难。
JavaScript是一种面向语言的语言。该对象是属性的集合。除了值类型“(参考类型)是对象”之外,还确定变量是否为对象。值类型可以在类型中使用。参考类型是实例。
我们可以通过新的对象创建一个对象,但实际上所有对象都是通过函数创建的,功能也是对象。
在JavaScript中,所有函数都将具有一个名为Prototype的公共和不加区分的属性,它将指向另一个对象:此对象通常称为函数的原型。在简单的术语中,原型是该函数的属性。该原型的属性值是一个对象(对象是属性的集合)。
当通过新的foo()创建上述代码时,a内部a中的隐藏prototype()链接到foo.protype引用的对象,即,即,即,即
现在,我们知道每个功能都有一个原型,然后引入隐藏的原型。这是每个对象具有的隐藏原型。换句话说,这个奇怪的引用内部原型对象。实际上,您正在使用的对象,当您获得它时,实际上称其为(getter函数)。Getter不在我们当前讨论的范围内。我们只需要知道这是我们使用的方法来获得对象的内部原型。标准对象。getProtototof(a)结果是相同的。
让我们解决,我们可以通过新的foo()创建一个创建对象的函数。
我们前面提到所有对象都是由函数创建的,功能也是对象。那么谁创建了功能?答案是函数:
我们可以通过新功能创建功能。它具有与我们通常创建的功能相同的效果。不建议使用此方法使用它,现在我们仍然可以得到它。
就像函数FOO是由函数创建的一样,OBJ也是由对象创建的。
请注意,我们前面提到过,对象既是函数又是对象。该对象由对象函数创建,然后该函数由函数函数创建.....-> - >?您觉得自己已经输入了周期?我让自己?我自己使用图片来表示:
从上图可以找到,这实际上是一个无限的循环!函数是一个函数,函数是一个对象,也具有属性。函数的函数是由本身创建的,并且指向自身。
说到您可能有点头晕,我们可以将其放在首位,然后查看原型和隐藏原型之间关联的含义。
让我们看一个段落:
访问对象属性时,引擎实际上调用了内部GET操作。此操作将检查对象本身是否包含此属性。如果找不到它,它将继续找到它。它将指向构建的-in Object.Prototype,该型号为null.O,因此在上述代码中,您可以从原型链中找到A属性。
借助原始链的帮助,可以在每个函数中使用函数函数原型(调用,应用,bindarguments ...)中的某些方法和属性,因为该函数是由函数函数创建的。对象,object.prototype(toString,valueOf,isPrototypeOf ...)也可以方便地使用。我们还可以将自定义属性添加到原型。
创建的新对象可以使用另一个对象上的属性和函数。原型链的机制可以轻松提醒我们其他语言的继承。信息意味着复制操作,但是JavaScript不会复制对象属性。JavaScript将在两个对象之间建立一个含义的对象之间的关联。委托单词可以更准确地描述JavaScript中对象的相关机制。
在每个函数原型(此示例中的foo.protype)上,默认情况下有一个公共和不加区分的属性构造器。此属性引用与对象关联的函数(FOO)。在上面的代码中,我们将使用FOO函数将其视为“构造函数”,因为我们看到它“构造”了此对象。我们可能会习惯使用Constructionor来理解和判断。
可以通过可以通过的结果来判断的栏的“构造函数”?
通过上面的代码,我们可以发现我们似乎应该是“构造”栏的foo函数,但是实际上,bar构造器这里没有指向foo,而是指向对象函数。
原因:
当我们理解主要链时,我们会知道这不足为奇。实际上,bar没有构造函数属性。bar将委托Foo.Prototype在原始链上。由于我们创建了一个新的原型对象,Foo没有默认的构造函数属性,然后A将继续找到原型链对象的顶部。链。默认值)。
因此,bar.sonstructor不是一个安全可靠的参考,有时会意外地指向您。
实际上,FOO和其他功能之间没有区别。功能本身不是构造函数。在JavaScript中,对“构造函数”的最准确解释是:所有函数都带有新调用。
在上一篇文章中,我们已经使用了多次新的。可以看出,当使用新对象调用施工功能时,将创建一个新对象。该新对象将由原型连接执行。直接说明是该新对象的隐藏原型链接的原型对象。
object.create()是对象的构建-in方法。它还创建一个新对象。与新的区别是什么?让我们看一下object.create()的polyfill代码,哪个部分实现了object.create()。
可以看出,此代码使用一个时间函数f将其指向我们要通过重写其Prototype属性关联的对象。等同于新对象B与FOO的内部原始链接。
object.create(),新对象的隐藏原型(b)指向现有对象(foo),它不仅可以充分利用原型,而且还可以避免一些不必要的麻烦(例如构造函数)。
通过省内(委托)的“祖先”(委托协会)
foo的实例:将确定整个A链中是否有一个foo.prototype点,也就是说,是否存在相同的对象。
B.异型型(C):将确定B是否出现在C的原型链中。
我们可以从下面的图中看到一个非常复杂的关系图,但是我们需要耐心地看到分析,并且可以从中获得很多收益。