zoukankan      html  css  js  c++  java
  • Js new一个函数和直接调用函数的区别

    不实用new,也就是普通的函数调用而已,所以若是函数本身没有返回值,普通的函数调用没有什么意义
    如:
    var person=new Person();//person是一个对象

    var person = Person();//这只是一次普通的函数调用并赋值而已。

    例一:

    [javascript] view plain copy
     
    1. function Person(name,age){  
    2.   
    3. this.name=name;  
    4. this.age=age;  
    5. this.sayName=function(){  
    6. alert(this.name);  
    7.       };  
    8. }  
    9.   
    10. //var person=new Person("张三",20); //此处为 构造对象,构造对象的话,返回的新对象是由解析器自己生成的。  
    11. var person=Person("张三",20); //假设我在Person函数里面加了return "你好"; 这时的person就不会报undefined,而是一个字符串你好  
    12. person.sayName();//报错 person undefined 此处为普通函数调用,又没有给定返回值,出错。  
    13.   
    14. //因为此时this指向window对象,  
    15. window.sayName();//此时不会报错  
    16.   
    17. 接下来就问,为什么我赋值给person,可以用window来引用呢?  
    18. 因为如果不用new就相当于普通函数调用,而 Person()根本没有返回值,  
    19. 所以Person根本就没赋值给person,此时的person只是一个undefined,  
    20. 但是Person却执行了一次,成为了window的对象,this指向了window,所以window可以直接使用Person的方法,  
    21.   
    22. Person("张三",20);  
    23. person.sayName();  
    例二:
    如果函数返回值为常规意义上的数值类型(Number、String、Boolean)时,new函数将会返回一个该函数的实例对象,
    而如果函数返回一个引用类型(Object、Array、Function)时,则new函数与直接调用函数产生的结果相同。
    如下:
    [javascript] view plain copy
     
    1. function Test()  
    2.   {  
    3.       this.name = "test";  
    4.       return "test";  
    5.   }  
    6.   var test1 = new Test();   //Object 对象,它有一个name 属性,并且返回一个字符串test  
    7.   var test2 = Test();    // 函数Test()属于Function对象   这个test2,它单纯是一个字符串  

    工厂模式:

    [javascript] view plain copy
     
    1. <script type="text/javascript">  
    2.     /*//工厂模式 
    3.     function Person(name,age) 
    4.     { 
    5.         var o = new Object(); 
    6.         o.name = name; 
    7.         o.age = age; 
    8.         o.getName = function() 
    9.         { 
    10.             alert(this.name); 
    11.         } 
    12.         return o; 
    13.     } 
    14.     var obj1 = new Person("liwen",25); 
    15.     var obj2 = Person("liwen1",25); 
    16.     obj1.getName();  //liwen*/        new一个函数的实例对象  
    17.     obj2.getName();  //liwen1*/      直接调用  
    18.   
    19. 这里new一个函数的对象和直接调用函数产生的结果相同,都可以弹出这个函数的name属性。注意这里函数的返回值是一个Funtion对象  
    [javascript] view plain copy
     
    1.   
    过程:
    构造函数不需要显示的返回值。使用new来创建对象(调用构造函数)时,如果return的是非对象(数字、字符串、布尔类型等)会忽而略返回值;如果return的是对象,则返回该对象。
    下面简单介绍下,javascript中new对象的过程:如var myObj = newPerson(“aty”,25);
    1.创建一个空的Object对象.var obj = new Object();
    2.将构造函数Person中this指向刚创建的obj对象
    3.将创建的obj的__proto__指向构造函数Person的prototype。这一步是建立对象和原型直接的对应关系。firefox下通过
    对象的__proto__属性能够访问到原型,IE下则没有暴露出相应的属性。
    4.执行构造函数Person()中的代码

     原文:https://blog.csdn.net/zchdjb/article/details/53038656

  • 相关阅读:
    GNSS学习笔记-观测量模型和定位定速方程
    矩阵学习-基本矩阵分类
    矩阵学习-QR分解和最小二乘问题求解
    ARM 处理器 MIPS/DMIPS/MFLOPS 理解
    GNSS学习笔记-信号频率分配表
    左移右移为负数的情况
    GNSS学习笔记-坐标转换
    GCC预编译宏查看
    Windows Store无法联网时安装WSL
    Virtual box中Ubuntu虚拟机磁盘碎片整理和空间清理方法
  • 原文地址:https://www.cnblogs.com/vicky-li/p/8669549.html
Copyright © 2011-2022 走看看