Javascript Node.js使用来自父对象的数据填充子对象(使用util.inherits进行继承)

Javascript Node.js使用来自父对象的数据填充子对象(使用util.inherits进行继承),javascript,node.js,inheritance,design-patterns,Javascript,Node.js,Inheritance,Design Patterns,假设我有一个父对象(比如base)和一个子对象,它是base-one的扩展版本 我将使用来自的示例代码。这里有家长: function Animal() { var walked = false function walk() { console.log('walking...') walked = true } function hasBeenWalked() { return walked } return { walk: wa

假设我有一个父对象(比如base)和一个子对象,它是base-one的扩展版本

我将使用来自的示例代码。这里有家长:

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
如果您在构造函数中没有任何参数,那么它非常有用,但是假设我们有一个
动物(颜色、大小)
和一个
猫(名称)

有没有一种简单的方法可以让猫('Garfield')从已经存在的
动物('orange','big')
中获取数据?我想从动物身上制造一些工厂,制造出许多不同名字的猫。我该怎么做


我能想到的唯一方法是在object
Animal(…)
中调用一个方法,例如
makeCat(name)
,它创建
新的猫(颜色、大小、名称)

,您需要重新构造一点

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
构造函数是向超类传递额外参数的地方

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

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引擎会这样做)。

这不是构造函数,而是工厂。您不能使用
util.inherits
。只需使用
函数Cat(name){…;Cat.\uuu proto_u=Animal('orange','big');…}
?如何从包含动物数据的动物对象创建Cat?这两种方法都可以做到这一点。i、 e.
cat.walk()
会成功的。我知道,但这不是问题的重点。假设我已经创造了一个动物,但是我想把这个对象转换成猫,然后用猫的方法来对付他哦,我明白了。是的,听起来你需要一个自定义的转换函数,虽然JS是原型而不是经典的,所以你可以使用一个对象作为另一个对象的原型。我想你已经很明白了,但是扩展原型(最简单的方法就是把道具复制到原型上),而不是替换它。是的,我有同样的想法,但我认为有一个更漂亮的。