让我说我有一个父对象(比如说是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)
答案 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引擎做它)。