这句话是什么;Object.protype";做什么

What does this statement " Object.prototype" do?

本文关键字:quot 什么 protype 是什么 Object 这句话      更新时间:2023-09-26
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;

有人能告诉我上面的代码在做什么吗?

让我们来分解一下:

Object.prototype

这为我们提供了作为Object变量原型的JavaScript对象。什么是原型?请允许我引用Yehuda Katz的优秀博客文章(非常值得一读(:

如果你试图在一个对象上查找一个密钥,但没有找到,JavaScript将在原型中查找它。它将紧随其后"原型链",直到它看到一个空值。那样的话它返回undefined。

接下来,我们有:

Object.prototype.toString

这将返回Object的原型上的toString函数。JavaScript函数可以使用它们的call函数来调用。这里有几个例子:

Object.prototype.toString.call("foo")  # => "[object String]"
Object.prototype.toString.call(5)      # => "[object Number]"

因此,它基本上只是一个通用的toString函数,它返回一个字符串,描述您作为参数提供给call的任何内容。请注意,在这些示例中,参数本身就是对象,因此它们返回将自己描述为对象的字符串。如果我们通过window.HTMLElement怎么办?

Object.prototype.toString.call(window.HTMLElement)  # => "[object HTMLElementConstructor]"

现在我们看到它返回了一个包含子字符串"Constructor"的字符串,这意味着它很可能是一个构造HTML元素的对象。最后我们可以理解完整的表达式:

Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor')  # => 19

由于"Constructor"是一个子串,因此indexOf返回19,19大于0。因此,基本上,这个表达式似乎是为了检查window.HTMLElement是否使用后缀"Constructor"来标识自己,我想这可能是某种浏览器标识检查。

(注意:在写这篇文章的时候,我使用Safari的Web Inspector控制台测试了这些表达式的评估,但你也可以使用Chrome或其他浏览器的控制台来测试类似的东西。(

  • Object是javascript中(几乎(所有类型继承的类(构造函数(
  • Object.prototype是可以在几乎所有对象的原型链中找到的对象
  • Object.prototype.toString是在不重写它的对象上调用的方法
  • 当对函数调用.call时,它会以函数的第一个参数作为上下文来调用该函数。15类似于CCD_ 16。不同之处在于,虽然undefined.toString()TypeError,但Object.prototype.toString.call(undefined)工作得非常好
  • HTMLElement是HTML元素从中继承的类。然而,这不是规范所要求的,在InternetExplorer中也不是这样,因为HTML元素没有原型,HTMLElement构造函数也不存在。由于window是浏览器环境中的全局对象,如果不被局部变量遮蔽,则window.HTMLElementHTMLElement相同,如果存在,则与一样。如果它不存在,读取HTMLElement会抛出ReferenceError,而window.HTMLElement会返回undefined
  • 因此,Object.prototype.toString.call(window.HTMLElement)HTMLElement.toString()相同,只是它在IE中工作,并使用正确的toString。它总是返回一个String
  • indexOf是一个字符串函数,用于查找其子字符串的第一个出现,如果子字符串不存在,则返回-1.indexOf('Constructor') > 0检查字符串是否包含"Constructor",而不是以CCD_36开头

因此,当在HTMLElement上调用时,此方法确定toString是否包含"Constructor"。规范要求:


4( 让class是O的[[class]]内部属性的值。
5( 返回字符串值,该值是连接三个字符串"[object"、class和"]"的结果。

因此,这将检查HTMLElement[[class]]是否为Constructor

最后,将检查结果分配给变量CCD_ 43。这表明在哪些环境中这是真的。此代码的作者假设返回值在Safari中、在Safari的每个版本中以及仅在Safari中将包含"Constructor"

作为参考,在Chrome中,Object.prototype.toString.call(HTMLElement)返回"[object Function]"