tangyuxian
文章79
标签37
分类5
js-New一个函数和直接调用的区别

js-New一个函数和直接调用的区别

使用New是构造函数,不使用New是函数调用,同时this指向不同。

总览

function Test(name, age, job) {
  console.log(this);
  this.name = name;
  this.age = age;
  this.job = job;
}

1、直接调用函数

var test1 = Test('Tom', 27, 'IT');

//来看下test1的值:

console.log(test1); // undefined

  直接调用上下文指向是window

2、使用new构造函数

  var test2 = new Test('Tom', 27, 'IT');

  //来看下test2的值:

  console.log(test2); 

  console.log(typeof test2); // "object"

new会使执行函数的上下文指向这个函数的本身。

最后得出一个猜测:

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

过程

构造函数不需要显示的返回值。使用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()中的代码


参考文档:博客园文章js New一个函数和直接调用的区别

本文作者:tangyuxian
本文链接:https://www.tangyuxian.com/2021/03/03/%E5%89%8D%E7%AB%AF/JavaScript/js-New%E4%B8%80%E4%B8%AA%E5%87%BD%E6%95%B0%E5%92%8C%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E7%9A%84%E5%8C%BA%E5%88%AB/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可