2012-06-04 70 views
1

node-binary二進制解析器建立其具有以下模式對象:如何繼承了「構造函數返回另一個對象」對象

exports.parse = function parse (buffer) { 
    var self = {...} 
    self.tap = function (cb) {...}; 
    self.into = function (key, cb) {...}; 
    ... 
    return self; 
}; 

如何繼承我自己的,開明的解析器嗎?這種模式是故意設計使繼承尷尬嗎?

我唯一的一次成功嘗試迄今在繼承的binary.parse(<something>)所有方法是使用_.extend爲:

var clever_parser = function(buffer) { 
    if (this instanceof clever_parser) { 
     this.parser = binary.parse(buffer); // I guess this is super.constructor(...) 
     _.extend(this.parser, this);   // Really? 
     return this.parser; 
    } else { 
     return new clever_parser(buffer); 
    } 
} 

這已經失敗我的氣味測試,和其他人的。有沒有什麼關於這使得在危險?

回答

0

如何:

var clever_parser = function (buffer) { 
    var parser = binary.parse(buffer); 
    _.extend(parser, clever_parser.methods); 
    return parser; 
} 

clever_parser.methods = { 
    foo: function() { ... }, 
    bar: function() { ... } 
}; 

binary.parse函數返回一個普通的對象(即從Object.prototype繼承的對象),這是不可能的(除非__proto__隨後重定向它的原型鏈接,但是這不標準和不贊成)。

因此,我們可以做的唯一的事情,就是延長該對象與手動我們的方法...

順便說一句,在clever_parser功能正常工作作爲工廠的功能。您不必打擾構造函數,以及new運算符。


此外,還可以採取相反的做法:第一,創建對象,繼承你的方法,然後與在該binary.parse功能分配的屬性來擴展它:

var clever_parser = function (buffer) { 
    var parser = Object.create(clever_parser.methods); 
    _.extend(parser, binary.parse(buffer)); 
    return parser; 
} 

如果這方法的作品,它肯定比我上面的原始解決方案好,因爲在這裏結果對象繼承你的方法(與上面相反,每個實例都包含方法作爲自己的屬性)。

相關問題