最近在看jQuery源码的时候看到这样一段代码:
// Define a local copy of jQuery
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
}
从中可以看到jQuery是个函数,这个函数有个返回值,而这个返回值就是通常所说的那个jQuery Object. 而这个返回值是通过new jQuery.fn.init()方法构造的。而jQuery.fn.init()的代码如下:
constructor: jQuery,
init: function( selector, context, rootjQuery ) {
var match, elem, ret, doc;
// Handle $(""), $(null), $(undefined), $(false)
if ( !selector ) {
return this;
}
// Handle $(DOMElement)
if ( selector.nodeType ) {
this.context = this[0] = selector;
this.length = 1;
return this;
}
...
return jQuery.makeArray( selector, this );
}
仔细可以发现,这个init方法是有返回值的,可能返回this,也可能返回其他对象。问题是,为什么要在构造函数中返回值? 对js的了解还不够深入,不好解释。但是可以通过代码验证一下。
<html>
<body>
<script>
var vjQuery = function(par) {
return new vjQuery.fn.init(par);
}
vjQuery.fn = vjQuery.prototype = {
init : function(par) {
if (par.name) {
this.name = par.name;
return this;
} else {
var newobj = {};
newobj.name = 'new object';
return newobj;
}
}
}
window.onload = function() {
console.log(vjQuery({name:'vjQuery'}).name);
console.log(vjQuery({age:12}).name)
}
</script>
</body>
</html>
上面代码输出如下:
vjQuery
new obj
可以看出当构造函数返回一个对象的时候,obj=new Constructor(),obj是这个构造函数返回的对象。很神奇的吧~
其实,用new生成一个对象,var myObj=new MyFun(),这个new主要干了以下这三件事情:
(1) 创建一个空对象{} C
(2) 将MyFun.prototype放入C原型链的顶端
(3) 执行MyFun函数,将MyFun中的this指向C,执行结束,如果没有返回值,则返回this
instanceof为js中判断实例的方法,判断的根据就是(例 a instanceof A) 判断a的原型链中是否含有A.prototype。