• Javascript 使用new 关键字调用函数和直接调用函数的区别


    1.函数有返回值

    $(function(){
    function Person(name,age,job){
    var o=new Object();
    o.name=name;
    o.age=age;
    o.job=job;
    o.sayHi=function(){
    console.log(this.name);
    }
    return o;
    }
    var people= new Person('xiaowang',24,'developer');//new
    people.sayHi();

    var people1= Person('xiaowang',24,'developer');
    people1.sayHi();
    });

    验证得到,new关键字调用和直接调用的结果是一样的

    Person函数创建了一个对象,并以相应的属性和方法初始化该对象,然后又返回了这个对象,除了使用new操作符且把使用的包装函数叫做构造函数之外,这个模式跟工厂模式是一模一样的。

    2.如果函数没有返回值

    $(function(){
    function Person(name,age,job){
    //var o=new Object();
    this.name=name;
    this.age=age;
    this.job=job;
    this.sayHi=function(){
    console.log(this.name);
    }
    //return o;
    }
    var people= new Person('xiaowang',24,'developer');//new
    people.sayHi();

    var people1= Person('xiaowang',24,'developer');
    people1.sayHi();
    });

    注意:构造函数在不返回值的情况下,默认返回新对象实例。

    new 调用会正常工作,而直接调用会出错

    3..如果返回值为函数

    $(function(){

    function Person(){
    this.name='test';
    return function(){return true};
    }
    var people= new Person();//构造对象
    var people1= Person();//直接调用

    console.log(people==people1);
    console.log(people===people1);
    });

    虽然浏览器结果一样,但是比较结果都是false,因为javascript对object和function比较是基于引用类型的。

    4.如果返回值为值类型(例如:number)

    $(function(){
    function Person(){
    this.name='test';
    return 2;//function(){return true};
    }
    var people= new Person();//构造对象
    var people1= Person();//直接调用

    console.log(people==people1);
    console.log(people===people1);
    });

    比较结果发现结果都是false。

    所以得出猜测

    如果函数返回值为常规意义上的值类型(Number、String、Boolean)时,new 函数将会返回一个该函数的实例对象,而如果函数返回一个引用类型(Object、Array、Function),虽然new函数与直接调用函数产生的结果等同,但是是两个不同的过程,一个是构造对象、一个是函数调用。

  • 相关阅读:
    sun.misc.BASE64Encoder找不到的解决方法
    eclipse里大小写转化的快捷键是什么
    jface viewer 理解
    如何在遗留代码基础上开发
    谈谈技术文档的编写
    jre build path 中的限制问题导致一些代码无法编译..如果设置
    android update automatically ( android 自动升级)
    各大集群存储产品点评
    关于@Autowired 注释为何不需要get Set
    VRML之desk
  • 原文地址:https://www.cnblogs.com/Seamless/p/7426627.html
Copyright © 2020-2023  润新知