摘要:循環(huán)問題當(dāng)循環(huán)調(diào)用時,一個模塊可能在未完成執(zhí)行時被返回。然后完成加載,并將對象提供給模塊。注意,這兩種方式是語義上不兼容的。的原型會被設(shè)置到一個從創(chuàng)建的新對象上??赏ㄟ^屬性訪問。接收的數(shù)據(jù)運作良好接收的數(shù)據(jù)運作良好例子使用的和接收的數(shù)據(jù)使用
1.循環(huán)問題
當(dāng)循環(huán)調(diào)用 require() 時,一個模塊可能在未完成執(zhí)行時被返回。
例如以下情況:
a.js:
exports.done = false; const b = require("./b.js"); console.log("在 a 中,b.done = %j", b.done); exports.done = true; console.log("a 結(jié)束");
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 結(jié)束");
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);
當(dāng) main.js 加載 a.js 時,a.js 又加載 b.js。 此時,b.js 會嘗試去加載 a.js。 為了防止無限的循環(huán),會返回一個 a.js 的 exports 對象的 未完成的副本 給 b.js 模塊。 然后 b.js 完成加載,并將 exports 對象提供給 a.js 模塊。
當(dāng) main.js 加載這兩個模塊時,它們都已經(jīng)完成加載。 因此,該程序的輸出會是:
$ node main.js
main 開始 a 開始 b 開始 在 b 中,a.done = false b 結(jié)束 在 a 中,b.done = true a 結(jié)束 在 main 中,a.done=true,b.done=true
需要仔細(xì)的規(guī)劃, 以允許循環(huán)模塊依賴在應(yīng)用程序內(nèi)正常工作.
2.原型繼承問題需要注意的是call、apply、bind方法都只能繼承對象的方法,卻不能對它們的原型進(jìn)行拷貝或繼承,為此我們一般使用混合的寫法,使用原型鏈和(apply或者call)方法進(jìn)行繼承。
而在nodeJS中,util包提供了一個方法util.inherits(constructor, superConstructor)
所以就得如下,通過結(jié)合使用call和inherits才能將其完全拷貝:
function Girl(name){ this.name = name; EventEmitter.call(this); } util.inherits(Girl,EventEmitter); var girl = new Girl();
注意,不建議使用 util.inherits()。 請使用 ES6 的 class 和 extends 關(guān)鍵詞獲得語言層面的繼承支持。 注意,這兩種方式是語義上不兼容的。
constructor
superConstructor
從一個構(gòu)造函數(shù)中繼承原型方法到另一個。 constructor 的原型會被設(shè)置到一個從 superConstructor 創(chuàng)建的新對象上。
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(`接收的數(shù)據(jù):"${data}"`); }); stream.write("運作良好!"); // 接收的數(shù)據(jù):"運作良好!"
例子:使用 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(`接收的數(shù)據(jù):"${data}"`); }); stream.write("使用 ES6");
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95994.html
摘要:循環(huán)問題當(dāng)循環(huán)調(diào)用時,一個模塊可能在未完成執(zhí)行時被返回。然后完成加載,并將對象提供給模塊。注意,這兩種方式是語義上不兼容的。的原型會被設(shè)置到一個從創(chuàng)建的新對象上??赏ㄟ^屬性訪問。接收的數(shù)據(jù)運作良好接收的數(shù)據(jù)運作良好例子使用的和接收的數(shù)據(jù)使用 1.循環(huán)問題 當(dāng)循環(huán)調(diào)用 require() 時,一個模塊可能在未完成執(zhí)行時被返回。例如以下情況:a.js: exports.done = fal...
摘要:基本的學(xué)習(xí)思路是跟著框架設(shè)計這本書,甚至可以說是這本書的讀書筆記。也參考很多網(wǎng)上解讀的博客和學(xué)習(xí)資料。當(dāng)然,最重要的資料還是框架的源代碼。后來由于開發(fā)者反對,新興的框架都在命名空間上構(gòu)建。 JavaScript框架學(xué)習(xí)筆記(一) 我為什么要學(xué)習(xí)框架 更深入的理解工具,以后用起來更順手而且也能做一定的工具取舍,學(xué)習(xí)理解新工具也就更快, 對提升js水平也很有幫助,框架有很多解決坑的經(jīng)典思...
摘要:自年月上線至今,夢幻模擬戰(zhàn)手游始終保持在游戲暢銷榜前的位置。夢幻模擬戰(zhàn)的發(fā)行方紫龍游戲,對此類風(fēng)險有著非常超前的認(rèn)知,在產(chǎn)品正式上線前,就與的手游安全團(tuán)隊進(jìn)行對接。 作者:WeTest小編商業(yè)轉(zhuǎn)載請聯(lián)系騰訊WeTest獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。原文鏈接:https://wetest.qq.com/lab/view/429.html WeTest 導(dǎo)讀 漏洞和外掛一直是危害游戲的罪...
摘要:而函數(shù)表達(dá)式的值是在運行時確定,并且在表達(dá)式賦值完成后,該函數(shù)才能調(diào)用。 Javascript定義函數(shù)有兩種類型 函數(shù)聲明 // 函數(shù)聲明 function wscat(type){ return type===wscat; } 函數(shù)表達(dá)式 // 函數(shù)表達(dá)式 var oaoafly = function(type){ return type===oaoafly; } 先...
閱讀 2491·2021-11-24 09:39
閱讀 3415·2021-11-15 11:37
閱讀 2268·2021-10-08 10:04
閱讀 3977·2021-09-09 11:54
閱讀 1890·2021-08-18 10:24
閱讀 1060·2019-08-30 11:02
閱讀 1805·2019-08-29 18:45
閱讀 1661·2019-08-29 16:33