這幾天集中注意力看了下nodejs,感覺打開了一扇新的大門,他和熟悉的java語言很不一樣,寫幾行很簡(jiǎn)單的代碼就可以創(chuàng)建服務(wù)器連接,當(dāng)然這背后多虧了chrome的v8 JavaScript引擎焕济。廢話有點(diǎn)多,接下來步入正題盔几,看看node中的繼承和客戶端js有什么不同吧晴弃。
一. Javascript客戶端繼承
我想熟悉js的同學(xué),關(guān)于js的繼承一定不陌生,實(shí)現(xiàn)繼承有很多中方式上鞠,最常用應(yīng)該就是借用構(gòu)造函數(shù)繼承(call和apply)和原型鏈繼承(prototype)吧际邻,例子如下:
function first(){
var self = this;
this.name = 'first';
}
first.prototype.output = function (){
console.log(this.name);
}
function second(){
first.call(this);
}
second.prototype = new first();
var two = new second();
two.output(); //first
上面的例子中用了組合繼承,即對(duì)于構(gòu)造函數(shù)的私有數(shù)據(jù)用call()
方法來繼承芍阎,對(duì)于共享的方法用原型鏈繼承世曾。
二. node中的繼承
在node中可以使用util
模塊的inherits
來實(shí)現(xiàn)繼承,util.inherits()
中有兩個(gè)參數(shù)谴咸,第一個(gè)樹子類構(gòu)造函數(shù)轮听,第二個(gè)使父類構(gòu)造函數(shù),例子代碼如下(將上面的稍微弄復(fù)雜了一點(diǎn)):
//引入util模塊
var util = require('util');
function first(){
var self = this;
this.name = 'first';
this.test = function(){
console.log(self);
console.log(self.name);
};
}
first.prototype.output = function (){
console.log(this.name);
}
function second(){
second.super_.call(this); //繼承構(gòu)造函數(shù)中的作用域
this.name = 'second';
}
util.inherits(second, first); //繼承原型鏈中的方法
var two = new second();
function third(func){
this.name = 'third';
this.callMethod = func;
}
var three = new third(two.test);
two.output(); //second
two.test(); //second
three.callMethod(); //second
看到輸出結(jié)果岭佳,和客戶端js中的繼承對(duì)比一下就可以很容易的看出血巍,其實(shí)second.super_.call(this)
和first.call(this)
完全等價(jià)。以及util.inherits(second, first)
和second.prototype = new first()
的功能是等價(jià)的(兩者還是有區(qū)別的珊随,但在這個(gè)示例中看起來一樣)藻茂。
我們可以看一下util.inherits
的實(shí)現(xiàn):
export.inherits = function (ctor, superCtor){
ctor.super_ = superCtor;
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
}
可以看出,util.inherits
只是繼承了父類原型鏈里的方法玫恳,還有super_
只是構(gòu)造函數(shù)的一個(gè)屬性。而second.prototype = new first();
繼承了所有方法优俘。也就是說util.inherits
相當(dāng)于second.prototype = first.prototype;
京办。