这句话是什么;Object.protype";做什么
What does this statement " Object.prototype" do?
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.HTMLElement
与HTMLElement
相同,如果存在,则与一样。如果它不存在,读取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]"
。
- 什么是"!函数(){}〃;javascript中的mean/do
- 什么是==+"在javascript中
- 什么是“;回归"javascript中的mean
- "image/png;base64"它做什么
- 什么是“=*"AngularJS中
- 什么's二“"javascript中的mean
- jQuery"return{foo:bar,foo2:bar2}"-它是什么
- 什么是“-[1;平均值;if(!-[1,]&&!window.XMLHttpRequest)"
- 这条线是什么意思"this.parentNode.firstChild.nodeName”;在jQuery H
- 这个Javascript出了什么问题"Internet Explorer无法打开Internet站点-操作中止
- 什么是“@"ecmascript 6中的字符平均值
- 什么是“;php://input"意思是
- 用于删除两个“”之间的字符的正则表达式是什么/"在javascript中
- 什么's是“”的parentNode<tr>"
- 这个符号是什么//@"在Javascript中
- "“聪明”;HTML中的溢出:有什么方法可以放省略号“"结尾有一个链接,可以查看整个内容
- 什么是“@"以及“="angularJS范围内的平均值
- 检查字符串是否只包含“0”-"什么都没有
- 什么是“>>="操作人员
- 什么's的函数|"(管道)操作员