为了账号安全,请及时绑定邮箱和手机立即绑定

价值,原型和特性的差异

价值,原型和特性的差异

墨色风雨 2019-09-26 14:59:31
价值,原型和特性的差异好!首先,这个问题来自于一个在jQuery宇宙中挖得太深(很可能迷路)的人。在我的研究中,我发现了jquery的主要模式是这样的(如果需要更正的话):(function (window, undefined) {    jQuery = function (arg) {       // The jQuery object is actually just the init constructor 'enhanced'       return new jQuery.fn.init(arg);    },    jQuery.fn = jQuery.prototype = {       constructor: jQuery,       init: function (selector, context, rootjQuery) {          // get the selected DOM el.          // and returns an array       },       method: function () {          doSomeThing();          return this;       },       method2: function () {          doSomeThing();          return this;,          method3: function () {             doSomeThing();             return this;          };          jQuery.fn.init.prototype = jQuery.fn;          jQuery.extend = jQuery.fn.extend = function () {             //defines the extend method           };          // extends the jQuery function and adds some static methods           jQuery.extend({             method: function () {}          })       })当$启动时,jQuery.prototype.init启动并返回一个元素数组。但我不明白它是如何增加了jQuery的方法类似.css或.hide等。到这个数组。我得到了静态方法。但是用所有这些方法都无法获得返回值和元素数组的方式。
查看完整描述

2 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

我也不喜欢这种模式。他们有一个init函数,它是所有jQuery实例的构造jQuery函数-该函数本身只是对象创建过程的包装器new

function jQuery(…) { return new init(…); }

然后,他们将这些实例的方法添加到init.prototype对象中。该对象作为接口公开jQuery.fn。另外,他们将prototypejQuery函数的属性设置为该对象-对于不使用该fn属性的用户。现在你有

jQuery.prototype = jQuery.fn = […]init.prototype

但是他们也做两件事:

  • 覆盖constructor原型对象的属性,将其设置为jQuery函数

  • 公开init功能jQuery.fn-自己的原型。这可能允许扩展$ .fn.init函数,但非常令人困惑

我认为他们需要/想要做所有这些事情以防万一,但是他们的代码是一团糟-从该对象文字开始,然后分配初始化原型。


查看完整回答
反对 回复 2019-09-26
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

如果将API视为方法的外部集合,而将jQuery函数视为包装器,则更容易消化。

它的基本构造如下:

function a() { return new b();}a.prototype.method = function() { return this; }function b() {}b.prototype = a.prototype;

除了ajQuerybjQuery.prototype.init

我确定Resig有将他的api构造函数放在init原型中的原因,但是我看不到它们。除了Bergi提到的以外,还有其他一些奇怪之处:

1)图案需要从参考副本jQuery.fn.init.prototypejQuery.prototype,至极允许怪异无端环:

var $body = new $.fn.init.prototype.init.prototype.init.prototype.init('body');

2)每个jQuery集合实际上是的一个实例jQuery.fn.init,但是由于它们引用相同的原型对象,因此欺骗我们“认为”该集合是的实例jQuery。您可以执行以下相同的魔术:

function a(){}function b(){}a.prototype = b.prototype;console.log( new b instanceof a); // trueconsole.log( new a instanceof b); // true

旁注:我个人使用了以下构造函数模式,结果相似但没有怪异:

var a = function(arg) {
    if (!(this instanceof a)) {
        return new a(arg);
    }};a.prototype.method = function(){ return this; };


查看完整回答
反对 回复 2019-09-26
  • 2 回答
  • 0 关注
  • 503 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信