我正在尝试理解闭包中的JavaScript寄生行为。
谁能告诉我为什么我们需要在Teacher函数构造函数中返回一个自变量?
function Person(name, age) {
return {
getName: function() {
return name;
},
getAge: function() {
return age;
},
};
}
function Teacher(name, age, subject) {
let self = Person(name, age);
self.teach = function() {
return `${name} is teaching ${subject}.`;
};
return self;
}发布于 2020-09-03 04:43:23
在您选择的寄生模式中,return是必需的,否则执行new Teacher将返回一个相当空的Teacher实例(即this)。在这种模式下,您选择避免使用this,这实际上是JavaScript在您使用new时为您准备的对象。
如果选择在JavaScript中使用寄生继承模式,则归结为忽略new和避免this,并显式创建父对象(这里称为self )、扩展它并返回它。
请注意,您可以使用Object.assign在"one“go中执行所有三个步骤,这允许您使用与Person中类似的对象文字语法
function Person(name, age) {
return {
getName: function() {
return name;
},
getAge: function() {
return age;
},
};
}
function Teacher(name, age, subject) {
return Object.assign(Person(name, age), {
teach() {
return `${name} is teaching ${subject}.`;
}
});
}这种模式的缺点是,每次构造对象时,都会为getAge、getName和teach创建新的函数对象。这是一种遗憾。原型继承提供的方法只存在一次,并且可以在不同的对象实例上调用(使用this-binding工具)。最重要的是,它允许您使用instanceof检查对象的“类型”。
尽管对于哪种模式比其他模式更好会有不同的看法,但很明显,通过寄生继承,您正在与标准的原型继承模式作斗争,该模式也随着class语法的引入而得到了改进。
https://stackoverflow.com/questions/63713031
复制相似问题