nodejs下function,new function和this的研究

摘要:
让我们将此函数视为直接调用函数时的方法,函数中此项下的变量将成为实例化对象的可访问属性(可以理解为public,而原始函数中没有这个的可以被视为私有变量,因此在调用方法时引用这个文件。Prototype在js中用于指定类型的原型。对于要用作方法的函数,需要打包一些需要在返回变量中使用的原型方法。

转:http://www.html5china.com/html5-article-3023-1.html


重点我都高亮了!

由于在使用nodejs之前接触js也比较少,最近一直被js的function和new function所困惑,由于两者都可以呈现出面向对象的样子,不知道两者的差别在哪里,就此问题做了一些研究。在研究的过程中发现this指针是个麻烦事,这在js前端使用的时候就已经体会到了,但是在node中的this又和前端js不太一样,也就此对node中的this做了下简单的研究。下面先分享一下对于function和new function的研究,主要是他们用于面向对象设计的方法和比较。

1. 首先,我们这里把function直接调用时将这个function当做方法来看待,而new function是将function当做类来看待。

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的都可以看做是私有变量,不能直接访问。

3. function当做方法来看时,即不new,则调用方法时的this指的是这个文件,我们称为文件对象。只有return的东西是可以被外部访问的,内部的数据则是被隐蔽的。

4. 结合2,3两点可以发现,无论是不是new,实际上都有对象的概念,即暴露一些公用方法和变量,隐藏一些私有属性,很多情况下两种设计方法都可以。

5. 对于继承,js中使用prototype来指定类型的原型,即function的原型对象。对于function当做方法来使用则需要将一些需要用到的原型的方法包在返回变量里。而当做类来使用则可以直接用.的形式来访问属性。从这点来说function当做类来表现面向对象的思想用起来要方便的多。

所以综上,如果是严格按照面向对象思想来设计程序,并且牵涉到继承或者大量的对象创建,则需要用到prototype,推荐将function当做类来使用。

ps:其实js的随意有时候是好处,有时候也不好,使用起来会混乱。所以例如function如果当做类时就不要写return了,而如果当做function来用,不要用this(从公有变量角度来说,呈现的效果是一样的,语法上不会有什么问题,但混起来使用会导致程序变得很乱)。

下面介绍一下this的使用,特别是在node下和前端js不同的地方:

nodejs中的this在某个对象中指向这个对象,在某个function中分两种情况:(1)直接调用function,指向文件对象。(2)new function则指向创建的对象。

浏览器端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的效果一样puncha:其实this === module.exports对象。例如:
//file1.js
this.x = 9;

//file2.js
var f1 = require(“./file1″);
console.log(f1.x);//得到结果9

所以综上,this在nodejs中的作用就是声明对象的共有变量,无论是new出来的对象还是类似var a = {}的对象又或者是整个文件对象。this的使用要时刻和对象的概念绑在一起,不然程序很容易出现问题

免责声明:文章转载自《nodejs下function,new function和this的研究》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用Unity实现VR中在黑板上写字(初级篇)Winform界面适应不同分辨率下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS架构:MVVM设计模式+RAC响应式编程

https://cloud.tencent.com/developer/article/1117009 一:为什么要用MVVM? 为什么要用MVVM?只是因为它不会让我时常懵逼。 每次做完项目过后,都会被自己庞大的ViewController代码吓坏,不管是什么网络请求、networking data process、跳转交互逻辑统统往ViewContr...

JS反混淆——构造可知DeviceToken、nouce与token

清空所有cookies后打开任意一本书的详情页,打开控制台中的Network。如下图所示,浏览器发出的第一个XHR请求为/bind,其中DeviceToken,nonce,Token均为POST中提交的数据。 找到访问网页的请求,如下图所示,返回头中没有出现set-cookie字段,可以判断DeviceToken,nonce,Token均为js生成的。...

vue实现文件夹的上传和下载

需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验; 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构。 支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息...

redis 连接池

所需jar:jedis-2.1.0.jar和commons-pool-1.5.4.jar Jedis操作步骤如下:1->获取Jedis实例需要从JedisPool中获取;2->用完Jedis实例需要返还给JedisPool;3->如果Jedis在使用过程中出错,则也需要还给JedisPool; package com.ljq.utils;...

JPA的Embeddable注解

来源于http://zjsword2000.blog.163.com/blog/static/4583983320083184844734/ 在hibernate中实现自定义类型,只要实现UserType接口即可或者以Component的形式提供.JPA的@Embedded有点类似,通过此注释可以在你的Entity中使用一般的java对象,此对象需要用@...

Js基础知识4-函数的三种创建、四种调用(及关于new function()的解释)

在js中,函数本身属于对象的一种,因此可以定义、赋值,作为对象的属性或者成为其他函数的参数。函数名只是函数这个对象类的引用。 函数定义 1 //函数的三种创建方法(定义方式) 2 function one(){ //函数声明语句,不属于任何对象,始终默认为全局对象 3 console.log(...