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,两者不是一样的吗?
jq的这种写法是为了省略一个
new
。jq的这个
$
符号其实就是它本身的构造函数的名字。但是在使用jq的时候,都是直接$(...)
,没有见过谁这么写的new $(...)
,这就是jq这种写法带来的结果。具体来说,在jq的基本结构中,你还少了一句很关键的语句,那就是——
$.prototype.init
也是一个构造函数,那么创建出来的实例也是有原型方法的,在使用了上面这句话之后,用new $.prototype.init
出来的对象就能够使用$
本身prototype
中的实例方法了。这种写法其实很别扭,要是直接这样,会更好理解一点:
不过jq诞生的年代还没有现在这种模块化js编程的理念,直接在标签里面用文件引用的话,当然会想办法尽量把变量的数量压制到最少。要是现在的话,直接
export { $ }
就行了,中间多余那么多变量也没问题。