资讯专栏INFORMATION COLUMN

【渗透】node.js经典问题

zhichangterry / 1931人阅读

摘要:循环问题当循环调用时,一个模块可能在未完成执行时被返回。然后完成加载,并将对象提供给模块。注意,这两种方式是语义上不兼容的。的原型会被设置到一个从创建的新对象上。可通过属性访问。接收的数据运作良好接收的数据运作良好例子使用的和接收的数据使用

1.循环问题

当循环调用 require() 时,一个模块可能在未完成执行时被返回。
例如以下情况:
a.js:

exports.done = false;
const b = require("./b.js");
console.log("在 a 中,b.done = %j", b.done);
exports.done = true;
console.log("a 结束");

b.js:

console.log("b 开始");
exports.done = false;
const a = require("./a.js");
console.log("在 b 中,a.done = %j", a.done);
exports.done = true;
console.log("b 结束");

main.js:

console.log("main 开始");
const a = require("./a.js");
const b = require("./b.js");
console.log("在 main 中,a.done=%j,b.done=%j", a.done, b.done);

当 main.js 加载 a.js 时,a.js 又加载 b.js。 此时,b.js 会尝试去加载 a.js。 为了防止无限的循环,会返回一个 a.js 的 exports 对象的 未完成的副本 给 b.js 模块。 然后 b.js 完成加载,并将 exports 对象提供给 a.js 模块。
当 main.js 加载这两个模块时,它们都已经完成加载。 因此,该程序的输出会是:
$ node main.js

main 开始
a 开始
b 开始
在 b 中,a.done = false
b 结束
在 a 中,b.done = true
a 结束
在 main 中,a.done=true,b.done=true

需要仔细的规划, 以允许循环模块依赖在应用程序内正常工作.

2.原型继承问题

需要注意的是call、apply、bind方法都只能继承对象的方法,却不能对它们的原型进行拷贝或继承,为此我们一般使用混合的写法,使用原型链和(apply或者call)方法进行继承。
而在nodeJS中,util包提供了一个方法util.inherits(constructor, superConstructor)
所以就得如下,通过结合使用call和inherits才能将其完全拷贝:

function Girl(name){
    this.name = name;
    EventEmitter.call(this);
}
util.inherits(Girl,EventEmitter);

var girl = new Girl();
注意,不建议使用 util.inherits()。 请使用 ES6 的 class 和 extends 关键词获得语言层面的继承支持。 注意,这两种方式是语义上不兼容的。

constructor
superConstructor
从一个构造函数中继承原型方法到另一个。 constructor 的原型会被设置到一个从 superConstructor 创建的新对象上。


superConstructor 可通过 constructor.super_ 属性访问。

const util = require("util");
const EventEmitter = require("events");

function MyStream() {
  EventEmitter.call(this);
}

util.inherits(MyStream, EventEmitter);

MyStream.prototype.write = function(data) {
  this.emit("data", data);
};

const stream = new MyStream();

console.log(stream instanceof EventEmitter); // true
console.log(MyStream.super_ === EventEmitter); // true

stream.on("data", (data) => {
  console.log(`接收的数据:"${data}"`);
});
stream.write("运作良好!"); // 接收的数据:"运作良好!"

例子:使用 ES6 的 class 和 extends:

const EventEmitter = require("events");

class MyStream extends EventEmitter {
  write(data) {
    this.emit("data", data);
  }
}

const stream = new MyStream();

stream.on("data", (data) => {
  console.log(`接收的数据:"${data}"`);
});
stream.write("使用 ES6");


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/52600.html

相关文章

  • 渗透node.js经典问题

    摘要:循环问题当循环调用时,一个模块可能在未完成执行时被返回。然后完成加载,并将对象提供给模块。注意,这两种方式是语义上不兼容的。的原型会被设置到一个从创建的新对象上。可通过属性访问。接收的数据运作良好接收的数据运作良好例子使用的和接收的数据使用 1.循环问题 当循环调用 require() 时,一个模块可能在未完成执行时被返回。例如以下情况:a.js: exports.done = fal...

    antz 评论0 收藏0
  • JavaScript框架学习笔记(一)

    摘要:基本的学习思路是跟着框架设计这本书,甚至可以说是这本书的读书笔记。也参考很多网上解读的博客和学习资料。当然,最重要的资料还是框架的源代码。后来由于开发者反对,新兴的框架都在命名空间上构建。 JavaScript框架学习笔记(一) 我为什么要学习框架 更深入的理解工具,以后用起来更顺手而且也能做一定的工具取舍,学习理解新工具也就更快, 对提升js水平也很有帮助,框架有很多解决坑的经典思...

    Shonim 评论0 收藏0
  • 《梦幻模拟战》漏洞挖掘全过程

    摘要:自年月上线至今,梦幻模拟战手游始终保持在游戏畅销榜前的位置。梦幻模拟战的发行方紫龙游戏,对此类风险有着非常超前的认知,在产品正式上线前,就与的手游安全团队进行对接。 作者:WeTest小编商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。原文链接:https://wetest.qq.com/lab/view/429.html WeTest 导读 漏洞和外挂一直是危害游戏的罪...

    maxmin 评论0 收藏0
  • 渗透】关于Javascript的函数声明和函数表达式

    摘要:而函数表达式的值是在运行时确定,并且在表达式赋值完成后,该函数才能调用。 Javascript定义函数有两种类型 函数声明 // 函数声明 function wscat(type){ return type===wscat; } 函数表达式 // 函数表达式 var oaoafly = function(type){ return type===oaoafly; } 先...

    zhaochunqi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<