2020年3月2日 星期一

inherits(繼承)

在node.js裡面也有繼承的方式,
但是,目前看到宣告一個函式可以繼承一個類別
補充:最後發現是宣告一個函式,它會繼承一個類別的建構子(Constructor)
那就表示這一個函式也是一個建講子(Constructor),
它身為一個建構子,就表示它是某一個類別的建構子,
所以,表示你也因為這一個函式inherts宣告了一個新的類別LoopProcessor
因此可以用這一個新的類別建立物件。

這一個方式還蠻特別的,可能要研究一下。
這裡看起來宣告的LoopProcessor繼承了EventEmitter(EventEmitterEventEmitter類別的建構子(Constructor))
例子在下面這裡
Day11 - Node.js EventEmitter


var emitter = require('events').EventEmitter;
// need util module when using inherits
var util = require('util');
 
function LoopProcessor(num) {
    // create a new object for current class
    var me = this;
 
    setTimeout(function () {
 
        for (var i = 1; i <= num; i++) {
            me.emit('BeforeProcess', i);
 
            console.log('Processing number:' + i);
 
            me.emit('AfterProcess', i);
        }
    }
    , 2000)
 
    return this;
}

//LoopProcessor is inherited from emitter class 
util.inherits(LoopProcessor, emitter)
 
var lp = new LoopProcessor(3);
 
lp.on('BeforeProcess', function (data) {
    console.log('About to start the process for ' + data);
});
 
lp.on('AfterProcess', function (data) {
    console.log('Completed processing ' + data);
});


可以參考util的function API
util.inherits

util.inherits(constructor, superConstructor)#
constructor <Function>
superConstructor <Function>

但是,目前並不建議使用util.inherits()
Usage of util.inherits() is discouraged. Please use the ES6 class and extends keywords to get language level inheritance support.


另外,這裡的this表示的是什麼呢?
一般來說,this表示的是在宣告類別(class)時,
會用到類別自己的成員或是函式時,
用這一個this.myfunction或this.mymember來表示。
但是,目前這一個宣告方式,
我想應該是因為他是一個建構子,
所以,這一個this表示的是一個未來繼承類別使用的。

補充:
var me = this;
我一開始有把這一行指令省略掉,
並且把下面所有me改為this

function LoopProcessor(num) {
    // create a new object for current class
    var me = this;
 
    setTimeout(function () {
 
        for (var i = 1; i <= num; i++) {
            me.emit('BeforeProcess', i);
 
            console.log('Processing number:' + i);
 
            me.emit('AfterProcess', i);
        }
    }
    , 2000)
 
    return this;
}

但這樣是行不通的,
程式跑到那裡會掛掉,
原因是什麼可能還要再研究一下~
var me = this;
是應該會宣告記憶體空間的地方,
所以,不能省略。

參考一下這個網站
Understanding the “this” Keyword in JavaScript
裡面提到
“this” Refers to a New Instance
When a function is invoked with the new keyword, then the function is known as a constructor function and returns a new instance. In such cases, the value of this refers to a newly created instance.
換句話說,若用這個方式的話,看起來是在function使用this
但實際上是建立一個類別(class)
這個方式還蠻特別的


如果我不使用parents的函式的話,
確實是可以不用宣告me這一個變數
例如修改如下

var emitter = require('events').EventEmitter;
// need util module when using inherits
var util = require('util');
 
function LoopProcessor(num) {
    // create a new object for current class
    // var me = this;
    setTimeout(function () {
        for (var i = 1; i <= num; i++) {
            // me.emit('BeforeProcess', i);
            console.log('Processing number:' + i);
            // me.emit('AfterProcess', i);
        }
    }
    , 2000)
    // return this;
}

//LoopProcessor is inherited from emitter class 
util.inherits(LoopProcessor, emitter)
 
var lp = new LoopProcessor(3);
 
lp.on('BeforeProcess', function (data) {
    console.log('About to start the process for ' + data);
});
 
lp.on('AfterProcess', function (data) {
    console.log('Completed processing ' + data);
});

換句話說,
如果我要使用母函式的東西的話,
我在函式宣告的時候,
就必需宣告一個變數,
並且把this指定給它

沒有留言: