2016-12-29 42 views
0

我正在研究应该由其他人使用的npm包。我决定这个软件包应该提供一些功能,使我的软件包中定义的对象更容易处理。具体功能,“委托”的方法。提供代理方法作为包作者

例如bark

function Dog(name) { 
 
    this.name = name 
 
} 
 

 
Dog.prototype.bark = function bark() { 
 
    return `${this.name}: Woof!` 
 
} 
 

 
function bark(dog) { 
 
    return dog.bark() 
 
} 
 

 
// Example use of bark. 
 
console.log(
 
    [ new Dog('Spike') ].map(bark) 
 
)

但是我意识到这也可以围绕实现它的其他方式;使得Dog.prototype.bark委托bark

function Dog(name) { 
 
    this.name = name 
 
} 
 

 
Dog.prototype.bark = function bark() { 
 
    return bark(this) 
 
} 
 

 
function bark(dog) { 
 
    return `${dog.name}: Woof!` 
 
} 
 

 
// Example use of bark. 
 
console.log(
 
    [ new Dog('Spike') ].map(bark) 
 
)

我的问题是:应该在包的作者更喜欢一种风格比其他或有没有区别?

我希望有一个很好的理由更喜欢一个比另一个,否则我们有另一种风格无休止地辩论。

+0

这实际上取决于用例。如果'bark'具有任何复杂的逻辑,或者以任何方式依赖狗的内部状态,看起来将该逻辑封装到类中会更好(选项1)。 –

+0

@EvanTrimboli根据方法是否需要访问(概念上)“私有”属性做出决定是一种选择。但是,当你看到结果时,它仍然显得很随意。 – Mick

+0

但事实并非如此,因为我也说过“依赖内部状态”,这意味着如果你有“子类”之类的话,实现就变得更加困难。可以说,这种模式本身在这种情况下并不特别有用,但它又取决于您的真实世界情景。 –

回答

0

考虑要实现两个类,DogWolf,这既实现这意味着他们有一个bark方法接口Canidae

大多数情况下,您会希望bark方法可以委托给Dog.prototype.barkWolf.prototype.bark方法,具体取决于传递的对象。

// Dog class 
function Dog(name) { 
    this.name = name 
} 

Dog.prototype.bark = function bark() { 
    return `${this.name}: Woof!` 
} 

// Wolf class 
function Wolf(name) { 
    this.name = name 
} 

Wolf.prototype.bark = function bark() { 
    return `${this.name}: Woooooooooooooooh!` 
} 

// Delegating method 
function bark(canidae) { 
    return canidae.bark() 
} 

// Example use of bark. 
console.log(
    [ new Dog('Spike'), new Wolf('Jack') ].map(bark) 
)