zoukankan      html  css  js  c++  java
  • 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”错误
  • 相关阅读:
    display:block 的认识
    document.dcoumentElement.scrollTop
    display:block的注意
    JavaScript中的Timer是怎么工作的
    创建函数还有一种方法
    $.fn.extend()与$.extend()的使用
    jq遍历的基础语法之二
    损失函数
    Python之函数装饰器
    激活函数
  • 原文地址:https://www.cnblogs.com/macliu/p/5341814.html
Copyright © 2011-2022 走看看