//传入window是为了:
//1.减少对window的搜索过程
//2.有利于代码压缩
//传入undefined是为了:
//防止在ie678中,undefined可以被传入数值改变
(function (window, undefined) {
var jQuery = function (selector) {
//此时jQuery是一个工厂函数,但是我们需要一个实例对象,因此我们可以在
//jQuery的原型中添加一个init方法,使其作为构造函数
//为什么不直接return jQuery出去呢? 反而要写一个init方法?
//因为我们想在外面直接用 $ 就能调用功能,如果直接return了jQuery,那么我们在外面调用时 还需要加上new 即 new $(''),这就有点麻烦了.所以为了省去new 我们需要写一个init方法,使其作为构造函数..jQuery()仅仅只是一个工厂函数
//点语法,优先级顺序: . 的优先级 > new > ()执行,因此是先去寻找原型中的init()再来new,所以 new 的是 init() 返回的是init的实例对象
return new jQuery.fn.init(selector);
}
jQuery.fn = jQuery.prototype = {
init: function (selector) {
var ele = document.querySelectorAll(selector);
//借用! apply借用! 相当于this.push();apply的参数为数组,把数组的每一项拿出来一个个的放进去!
[].push.apply(this, ele);
//这一句相当于== Array.prototype.push.apply(this,ele);
},
//写css方法 写在jQuery的原型中
css: function (name, value) {
if (arguments.length == 2) { //如果实参为2个参数
for (var i = 0; i < this.length; i++) {
this[i].style[name] = value;
}
} else if(arguments.length == 1) { //如果实参为1个参数
if(typeof arguments[0] == 'string') {
//如果为string类型,则应该是获取元素样式---->window.getComputedStyle(obj)[name] -->获取元素的样式属性
return window.getComputedStyle(this[0])[name];
} else { 传进来的参数为对象类型,应该先遍历对象
for(var key in name) {
for (var i = 0; i < this.length; i++) {
this[i].style[key] = name[key];
}
}
}
}
return this;
}
}
//让init的实例对象可以调用jQuery原型中的方法
jQuery.fn.init.prototype = jQuery.fn;
//暴露出去,并让$生效
window.jQuery = window.$ = jQuery;
})(window)