• jQuery源码学习:使用隐藏的new来创建对象


    在JQuery源码中发现,JQuery定义一个类,但不用new关键字去创建该类对象,而使用方法调用()方式去创建该对象。

    很多时候我们是这样写类,然后使用new创建对象的:

    function Person(name,age){ 
      this.name=name; 
      this.age=age; 
    } 
    Person.prototype
    ={   setName : function(n){this.name=n;},   getName : function(){return this.name;} } var p = new Person('jack',25);

    现在我们可以试试改成这样的:

    function Person(name,age){ 
      //条件改为(this==window)或(this==self)或(this.constructor!=Object) 
      if(!this.setName){ 
        return new Person(name,age); 
      } 
      this.name=name; 
      this.age=age; 
    } 
    Person.prototype
    ={   setName : function(n){this.name=n;},   getName : function(){return this.name;} } var p = Person('jack',25);

    注意这种写法较最上面的写类方式中多了以下代码(魔鬼总是隐藏在细节中):

    if(!this.setName){ 
      return new Person(name,age); 
    } 

    创建类的实例(对象)方式也变成了这样:

    var p = Person('jack',25); 

    这种创建方式(函数调用)较上面我们常用的那种方式少了new和空格,实际上是在类内部new了。而这样方式每次创建对象可以减少4个byte。 
    如果把类内部的if判断条件换成非prototype上的属性,如this.name。程序会提示出错:too much recursion

    function Person(name,age){ 
      if(!this.name){ 
        return new Person(name,age); 
      } 
      this.name=name; 
      this.age=age; 
    } 
    
    Person.prototype={ 
      setName : function(n){this.name=n;}, 
      getName : function(){return this.name;} 
    } 
    var p = Person('jack',25); //会报“too much recursion”错误
  • 相关阅读:
    border-radius:50%和100%究竟有什么区别
    GoLang几种读文件方式的比较
    Golang Import使用入门
    golang: 常用数据类型底层结构分析
    Python--字典操作
    Python--字符串操作
    Python split 分割中文
    LR(逻辑回归)
    Python--列表操作
    Eclipse 使用Anaconda python 解释器
  • 原文地址:https://www.cnblogs.com/macliu/p/5341814.html
Copyright © 2020-2023  润新知