Javascript Node.js使用来自父对象的数据填充子对象(使用util.inherits进行继承)
假设我有一个父对象(比如base)和一个子对象,它是base-one的扩展版本 我将使用来自的示例代码。这里有家长: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
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是原型而不是经典的,所以你可以使用一个对象作为另一个对象的原型。我想你已经很明白了,但是扩展原型(最简单的方法就是把道具复制到原型上),而不是替换它。是的,我有同样的想法,但我认为有一个更漂亮的。