[js]小谈 new

最近在看jQuery源码的时候看到这样一段代码:

 // Define a local copy of jQuery

    jQuery = function( selector, context ) {
        // 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()的代码如下:

jQuery.fn = jQuery.prototype = {

    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>

    <head></head>
    <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。  

 

参考:http://blog.csdn.net/sykent/article/details/8003343 
 

 

 

 

 

 

posted @ 2012-09-06 20:09  orchid  阅读(217)  评论(0编辑  收藏  举报