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