Nodejs下function, new function和this的研究

Nodejs下function, new function和this的研究

由于在使用nodejs之前接触js也比较少,最近一直被js的function和new function所困惑,由于两者都可以呈现出面向对象的样子,不知道两者的差别在哪里,就此问题做了一些研究。在研究的过程中发现this指针是个麻烦事,这在js前端使用的时候就已经体会到了,但是在node中的this又和前端js不太一样,也就此对node中的this做了下简单的研究。下面先分享一下对于function和new function的研究,主要是他们用于面向对象设计的方法和比较。 <br/> <br/>1. 首先,我们这里把function直接调用时将这个function当做方法来看待,而new function是将function当做类来看待。 <br/> <br/>2. 基于第一点,当把function作为类来使用时,function中的this下的变量都会变成实例化对象的可访问属性(可以理解为public,其实nodejs中的this就是用来定义类的公有变量的,关于this会在下面做进一步的解释),例如function A(){this.x = 1;},则var a = new A();后相当于得到var a = {x:1};this指向这里类生成的对象本身,this.x就相当于将x这个属性暴露出去,而原本function中没有this的都可以看做是私有变量,不能直接访问。 <br/> <br/>3. function当做方法来看时,即不new,则调用方法时的this指的是这个文件,我们称为文件对象。只有return的东西是可以被外部访问的,内部的数据则是被隐蔽的。 <br/> <br/>4. 结合2,3两点可以发现,无论是不是new,实际上都有对象的概念,即暴露一些公用方法和变量,隐藏一些私有属性,很多情况下两种设计方法都可以。 <br/> <br/>5. 对于继承,js中使用prototype来指定类型的原型,即function的原型对象。对于function当做方法来使用则需要将一些需要用到的原型的方法包在返回变量里。而当做类来使用则可以直接用.的形式来访问属性。从这点来说function当做类来表现面向对象的思想用起来要方便的多。 <br/> <br/>所以综上,如果是严格按照面向对象思想来设计程序,并且牵涉到继承或者大量的对象创建,则需要用到prototype,推荐将function当做类来使用。 <br/> <br/>ps:其实js的随意有时候是好处,有时候也不好,使用起来会混乱。所以例如function如果当做类时就不要写return了,而如果当做function来用,不要用this(从公有变量角度来说,呈现的效果是一样的,语法上不会有什么问题,但混起来使用会导致程序变得很乱)。 <br/> <br/>下面介绍一下this的使用,特别是在node下和前端js不同的地方: <br/> <br/>nodejs中的this在某个对象中指向这个对象,在某个function中分两种情况:(1)直接调用function,指向文件对象。(2)new function则指向创建的对象。 <br/> <br/>和浏览器端js的this不同,浏览器端js的this指向的统一是window对象,并且未声明的全局属性也都认为是window对象的属性。例如var a = 9;然后调用alert(this.a)得到的结果就是9,。而在node中,却得不到这样的结果。如果你这样写,var a = 9;console.log(this.a);那么你只能得到undefined。这是因为node中的this表明的是这个文件对象,而this.a并不是说文件内定义的默认属性a,而是这个文件可以被其他js文件访问的属性a。如果另一个js文件require了这个文件,便可以直接得到这个属性值,和exports的效果一样。例如: <br/>//file1.js <br/>this.x = 9; <br/> <br/>//file2.js <br/>var f1 = require("./file1"); <br/>console.log(f1.x);//得到结果9 <br/> <br/>所以综上,this在nodejs中的作用就是声明对象的共有变量,无论是new出来的对象还是类似var a = {}的对象又或者是整个文件对象。this的使用要时刻和对象的概念绑在一起,不然程序很容易出现问题


10 回复

Nodejs下function, new function和this的研究

由于在使用Node.js之前接触JavaScript的机会较少,最近一直在研究functionnew function的区别,以及它们在面向对象设计中的应用。同时,我也注意到了this指针在Node.js中的特殊行为。以下是我对这些概念的一些理解和研究。

1. functionnew function

  • function作为方法:当我们直接调用一个function时,这个function可以被视为一种方法。此时,this通常指向当前文件对象。这意味着内部的数据是私有的,只能通过return语句公开。

    function add(a, b) {
      return a + b;
    }
    console.log(add(1, 2)); // 输出 3
    
  • new function作为类:当我们使用new关键字调用一个function时,这个function会被视为一个类。此时,this指向新创建的对象实例。通过这种方式,我们可以定义类的公共属性和方法。

    function Person(name) {
      this.name = name;
    }
    
    Person.prototype.sayHello = function() {
      console.log(`Hello, I am ${this.name}`);
    };
    
    const person = new Person('Alice');
    person.sayHello(); // 输出 "Hello, I am Alice"
    

2. this在Node.js中的使用

在Node.js中,this的行为与浏览器环境有所不同。在某个对象中,this指向该对象;在某个函数中,this的行为取决于如何调用该函数:

  • 直接调用函数:此时this指向当前模块对象(即文件对象)。

    // file1.js
    this.x = 9;
    
    // file2.js
    var f1 = require('./file1');
    console.log(f1.x); // 输出 9
    
  • 使用new调用函数:此时this指向新创建的对象实例。

    function Person(name) {
      this.name = name;
    }
    
    const person = new Person('Bob');
    console.log(person.name); // 输出 "Bob"
    

3. 总结

  • 面向对象设计:如果严格按照面向对象的设计思路,并且涉及继承或大量对象创建,建议使用new function,并利用prototype来实现继承。这样可以更方便地体现面向对象的思想。

  • this的作用:在Node.js中,this主要用来声明对象的共有变量。无论是通过new创建的对象,还是通过var obj = {}创建的对象,this都可以用来定义对象的共有属性。

  • 避免混淆:为了保持代码清晰,建议在使用function时明确其用途。如果将其作为类使用,尽量不要使用return;如果作为方法使用,尽量避免使用this(从公有变量的角度来说,这样做效果相同,但混合使用会导致代码混乱)。

通过以上分析,我们可以更好地理解和使用Node.js中的functionnew function以及this指针,从而写出更清晰、更易于维护的代码。


有点乱,好像不是这个样子的。

我的理解: <br/> <br/>fun(),直接调用就是调用Function.call <br/> <br/>而 new fun()就是 : <br/> var a = new Object(); <br/>fun.call(a)

可能是有点问题的,欢迎各种指正

恩,是这样子的,其实new fun()就是把方法放到指定的上下文(某个对象)去运行。我写这文是因为开发过程中碰到封装的概念,主要是从如何更好使用面向对象思想来使用js的角度出发的,是讨论直接fun()然后return一个变量组比较好还是new fun()的方式比较好。

funtion返回undefined若没有指定return值的话;new funtion返回的则是函数本身 <br/>文中ps那段说的过于绝对,也不具有指导意义,脱离需求谈代码设计也是不合理的

函数调用分4种: <br/>直接调用:function aaa(){}; a(); <br/>对象调用:a={aaa:function(){}};a.aaa(); <br/>构造函数调用:function aaa(){}; var bbb = new aaa(); <br/>call,apply调用: <br/>function aaa(){ <br/>alert(this.name); <br/>}; <br/>var bbb = {name:“xxx”}; <br/>aaa.call(bbb, null);// “xxx” <br/>CALL和APPLY的区别在于第二个参数CALL是传按顺序传参,而APPLY是传一个数组参数

搞清楚一个问题,function是关键字,Function是对象,你用function关键字定义个一个函数时实际上是创建了一个Function对象。在Javascript中,所有东西皆为对象,类也是对象,比如说Object\Function\String等等。不要拿强类型语言的特性去硬套Javascript上的语言特性,你只等说他们类似不能说他们一致。

看了半天不明白楼主想说什么,nodejs环境下javascript和浏览器环境下javascript的区别?很怪异的说法

Nodejs 下 function, new Function 和 this 的研究

在 Node.js 中,functionnew Function 的使用方式有所不同,尤其是在面向对象的设计模式中。以下是它们的区别及相关的 this 指针的行为。

1. function 与 new Function

  • function 作为方法使用

    • function 不通过 new 关键字调用时,它通常作为一个方法来使用。
    • 在这种情况下,this 指向当前执行上下文,通常是模块文件本身。
    • 示例:
    // file.js
    function add(a, b) {
      return a + b;
    }
    
    module.exports = {
      add: add
    };
    
    // 使用
    const { add } = require('./file');
    console.log(add(1, 2)); // 输出 3
    
  • new Function 作为类使用

    • function 通过 new 关键字调用时,它被视为一个构造函数,用于创建新的对象实例。
    • this 指向新创建的对象实例。
    • 示例:
    function Person(name) {
      this.name = name;
    }
    
    const person = new Person('Alice');
    console.log(person.name); // 输出 Alice
    

2. this 的使用

  • 直接调用 function

    • 在直接调用 function 时,this 指向当前模块文件对象。
    • 示例:
    // file.js
    this.x = 9;
    console.log(x); // 输出 9
    
    // 可以在其他文件中访问
    const file = require('./file');
    console.log(file.x); // 输出 9
    
  • new Function 创建对象

    • 在使用 new 创建对象时,this 指向新创建的对象实例。
    • 示例:
    function Person(name) {
      this.name = name;
    }
    
    const person = new Person('Bob');
    console.log(person.name); // 输出 Bob
    

3. 综合考虑

  • 如果你需要严格遵循面向对象的设计原则,特别是涉及继承或大量对象创建的情况,建议使用 new 关键字来创建对象。
  • 如果你只是简单地需要一个方法,直接调用 function 即可。
  • 使用 this 时,要注意它的作用域,确保它在正确的作用域内使用,以避免混淆和错误。

通过这些示例和解释,希望你能更好地理解 function, new Functionthis 在 Node.js 中的不同行为及其用途。

回到顶部