• [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 
     

  • 相关阅读:
    RDD弹性分布式数据集的基本操作
    spark-shell的Scala的一些方法详解
    浅谈架构
    关于MapReduce二次排序的一点解答
    mysql 和 hive 和分布式zookeeper和HBASE分布式安装教程
    2018暑假总结
    暑假总结07
    2018暑假总结06
    2018暑假总结05
    2018暑假总结04
  • 原文地址:https://www.cnblogs.com/orchid/p/2674115.html
Copyright © 2020-2023  润新知