javascript - 关于jquery源码分析中一段的疑惑?
大家讲道理
大家讲道理 2017-04-11 12:16:01
[JavaScript讨论组]
var aQuery = function(selector, context) {
       return  new aQuery.prototype.init();
}
aQuery.prototype = {
    init: function() {

        return this;
    },
    name: function() {
};

上面这个代码,根据测试,aQuery.prototype.init()最后返回的应该是aQuery.prototype本身,那么aQuery()最后返回的可以说是new的init的一个实例,也可以当成是aQuery.prototype的一个实例?

var aQuery = function(selector, context) {
     
}
aQuery.prototype = {
    init: function() {

        return this;
    },
    name: function() {
alert("hi")},
};
console.log(new aQuery.prototype)

这个却显示aQuery.prototype不是一个constructor,反而aQuery.prototype.init()倒是可以new,两者不是一样的吗?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(1)
黄舟
  1. jq的这种写法是为了省略一个new
      jq的这个$符号其实就是它本身的构造函数的名字。但是在使用jq的时候,都是直接$(...),没有见过谁这么写的new $(...),这就是jq这种写法带来的结果。

  2. 具体来说,在jq的基本结构中,你还少了一句很关键的语句,那就是——

    $.prototype.init.prototype = $.prototype;

    $.prototype.init也是一个构造函数,那么创建出来的实例也是有原型方法的,在使用了上面这句话之后,用new $.prototype.init出来的对象就能够使用$本身prototype中的实例方法了。

  3. 这种写法其实很别扭,要是直接这样,会更好理解一点:

    var $ = function(selector, context) {
        return  new fn(selector, context);
    }
    function fn(selector, context) {
        ...
    }
    fn.prototype = {
        ...
    }

      不过jq诞生的年代还没有现在这种模块化js编程的理念,直接在标签里面用文件引用的话,当然会想办法尽量把变量的数量压制到最少。要是现在的话,直接export { $ }就行了,中间多余那么多变量也没问题。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号