Node.js用父对象中的数据填充子对象(使用util.inherits继承)

时间:2015-11-25 10:56:14

标签: javascript node.js inheritance design-patterns

让我说我有一个父对象(比如说是base)对象,以及一个子对象,它是基础对象的扩展版本。

我将使用metaduck.com中的示例代码。在这里我们有父母:

function Animal() {

  var walked = false

  function walk() {
    console.log('walking...')
    walked = true
  }

  function hasBeenWalked() {
    return walked
  }

  return {
    walk: walk
  , hasBeenWalked: hasBeenWalked
  }
}
module.exports = Animal

和孩子:

var Animal = require('./animall')

function Cat() {
  var cat = {}
  var walked = false

  cat.__proto__ = Animal()

  cat.pat = function pat() {
    console.log('being patted')
  }

  cat.lasagna = function lasagna() {
    console.log('Lasagna!')
    walked = true
  }

  return cat
}

module.exports = Cat

如果你在构造函数中没有任何参数,它会很有用,但我们假设我们有一个Animal(color,size)和一个Cat(name)

是否有一种简单的方法可以让Cat('Garfield')填充现有Animal('orange','big')的数据?我想从Animal创建一些工厂,创造出许多不同名称的猫。我怎么能这样做?

我能想到的唯一方法是在对象makeCat(name)中调用实例Animal(...)创建new Cat(color,size,name)

的方法

1 个答案:

答案 0 :(得分:2)

你需要重组一下。

function Animal( args ) {
  // this is your constructor
  // arguments can be used here
}

Animal.prototype.walk = function() {  }
Animal.prototype.etc_etc_etc

function Cat( args ) {
  Animal.call( this, additional, arguments )
}

utils.inherits( Cat, Animal )

Cat.prototype.pat = function() { }

Animal构造函数的调用是将其他参数传递给超类的地方。

或者,稳定版本的节点支持类语法

class Animal {
  constructor( args ) {

  }
  walk() { }
}

class Cat extends Animal {
  constructor( args ) {  
    super( additional, arguments )
  }
  pat() { }
}

创建这样的“类”的主要好处是可以正确设置原型链。使用当前的解决方案,您可以在构造函数中处理this的方法,您将为您创建的每个对象创建这些方法,100 cats表示100个相同的pat函数。 JS中的原型继承意味着pat应该在原型上,其中Cat的所有100个实例都可以使用那个函数(绑定范围自己,你不必担心这个,JS引擎做它)。