摘要:循環問題當循環調用時,一個模塊可能在未完成執行時被返回。然后完成加載,并將對象提供給模塊。注意,這兩種方式是語義上不兼容的。的原型會被設置到一個從創建的新對象上??赏ㄟ^屬性訪問。接收的數據運作良好接收的數據運作良好例子使用的和接收的數據使用
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");
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95994.html
摘要:循環問題當循環調用時,一個模塊可能在未完成執行時被返回。然后完成加載,并將對象提供給模塊。注意,這兩種方式是語義上不兼容的。的原型會被設置到一個從創建的新對象上??赏ㄟ^屬性訪問。接收的數據運作良好接收的數據運作良好例子使用的和接收的數據使用 1.循環問題 當循環調用 require() 時,一個模塊可能在未完成執行時被返回。例如以下情況:a.js: exports.done = fal...
摘要:基本的學習思路是跟著框架設計這本書,甚至可以說是這本書的讀書筆記。也參考很多網上解讀的博客和學習資料。當然,最重要的資料還是框架的源代碼。后來由于開發者反對,新興的框架都在命名空間上構建。 JavaScript框架學習筆記(一) 我為什么要學習框架 更深入的理解工具,以后用起來更順手而且也能做一定的工具取舍,學習理解新工具也就更快, 對提升js水平也很有幫助,框架有很多解決坑的經典思...
摘要:自年月上線至今,夢幻模擬戰手游始終保持在游戲暢銷榜前的位置。夢幻模擬戰的發行方紫龍游戲,對此類風險有著非常超前的認知,在產品正式上線前,就與的手游安全團隊進行對接。 作者:WeTest小編商業轉載請聯系騰訊WeTest獲得授權,非商業轉載請注明出處。原文鏈接:https://wetest.qq.com/lab/view/429.html WeTest 導讀 漏洞和外掛一直是危害游戲的罪...
摘要:而函數表達式的值是在運行時確定,并且在表達式賦值完成后,該函數才能調用。 Javascript定義函數有兩種類型 函數聲明 // 函數聲明 function wscat(type){ return type===wscat; } 函數表達式 // 函數表達式 var oaoafly = function(type){ return type===oaoafly; } 先...
閱讀 2475·2021-11-24 09:39
閱讀 3406·2021-11-15 11:37
閱讀 2251·2021-10-08 10:04
閱讀 3965·2021-09-09 11:54
閱讀 1883·2021-08-18 10:24
閱讀 1034·2019-08-30 11:02
閱讀 1793·2019-08-29 18:45
閱讀 1651·2019-08-29 16:33