【问题标题】:How these Jquery, ExtJs framework overwrite native Javascript这些 Jquery、ExtJs 框架如何覆盖原生 Javascript
【发布时间】:2012-12-11 10:52:15
【问题描述】:

我看过 ExtJs 的教程,使用的代码如下:

 var myDiv = Ext.get('myDiv');
 myDiv.highlight();   

hightlight() 函数来自哪里?它来自原生 Javascript 还是 ExtJs 框架?我做了简单的搜索,但在 API 文档中找不到它。如果 hightlight() 来自 ExtJs 框架,它实际上是如何覆盖 Javascript 中的本机行为的?

我想知道 Jquery 选择器,比如说 $('#myDiv') 是如何被 Javascript 识别的? $('') 符号不应该被 Javascript 编译器识别吧?

我的描述很差,抱歉。我是 javascript 初学者。

【问题讨论】:

标签: javascript html extjs


【解决方案1】:

Prototype、Ext 等扩展了 DOM 对象的原型(顺便说一句,这很漂亮 questionable behaviour),例如HTMLElement.prototype,并为其添加自己的功能。这使您可以像示例中所示那样调用它们。

jQuery 悬停根本不使用任何魔法。 $ 是 JavaScript 中的普通标识符,就像普通字符一样。所以它只不过是一个名为$ 的函数,然后你在执行$('#selector') 等时调用它。该函数的返回值通常是一个jQuery 对象,它的行为类似于一个数组并且有很多有用的方法。因此,您永远不会处理原生 DOM 对象,而只是处理一个包含其中一个或多个对象的对象。

【讨论】:

  • jQuery 没有。 jQuery 包装了原始对象。
  • 我认为 IE 不会让你扩展 HTMLElement.prototype。在 FF 和 GC 中 - 没问题。
  • prototypejs.org/learn/extensions.html - 它确实扩展了当然不属于 ECMAScript 的 DOM 对象(因为 ECMAScript 本身甚至不知道 DOM 是什么)
  • @skyrim.ice 基本上就是HTMLElement.prototype.myFunc = ...。问题是,当HTMLElement 由IE 提供时,它适用于Array.prototype,但不适用于HTMLElement.prototype
  • 这是不正确的。 Ext 不会改变 DOM 节点 API。 Ext.get 返回一个 Ext Element 对象,该对象将 DOM 节点包裹在自定义对象中,提供所示的 API。这个答案与原来的问题基本无关。
【解决方案2】:

Ext 提供了一个Element 对象,这是由Ext.get() 之类的调用返回的。 Element wraps DOM 节点,但肯定不会改变 HTMLElement 对象(就像 jQuery 的 $ 函数一样)。事实上,Element.dom 属性暴露了原始未更改的 DOM 节点。 Element.highlight() 只是一个 Ext.Element 方法,并在 API 文档中清楚地记录了 -- 它并没有什么神秘之处。

虽然 Ext 在以前的版本中用于修改一些原生的 JS 对象(日期、字符串、对象),但它从未接触过原生的 HTMLElement 对象。这曾经是大多数 JS 库中的常见做法,但截至 4.0 版(现在已经有几年了)Ext 还没有触及任何原生 JS 原型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-28
    • 2020-06-02
    • 2015-02-05
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多