有时候你认为你知道一些事情,然后事实证明你真的不知道......
在过去的几天里,我一直在对 Javascript 继承进行大量研究,以便在本地的技术小组进行演讲。没问题,我想,我知道这些东西,我会复习一下...
事实证明,我还有很多东西要学。这是让我感到惊讶的第一件事:
function Vehicle() {
function move() {
console.log('moving');
}
return {move: move}
}
function OtherVehicle() {
this.alsoMove = function() {
console.log('also moving')
}
}
第一种方法是我一直理解的模块模式。第二个,虽然我不知道它的名字,但我知道它基本上是等价的 - 只是一个小的句法变化。
除了:
(new Vehicle()) instanceof Vehicle \\ returns false
(new OtherVehicle()) instanceof OtherVehicle \\ returns true
new Vehicle()
返回一个“对象”。
看着这个,这是有道理的,但这不是我所期待的。
任何人都可以解释这里发生了什么,为什么,也许可以给我指出一个非常好的资源来深入了解这个问题?
作为后续行动。
var Car = function() {
function drive() { console.log('driving') };
return {drive: drive}
}
Car.prototype = new Vehicle() //I know, Object.create preferred
(new Car).move() //undefined
// However...
var Car = function() {
this.drive = function () { console.log('driving') };
}
Car.prototype = new Vehicle();
(new Car()).move() //output 'moving'
那么,模块模式不能用于继承吗?
还是我今天刚从床的另一边醒来,应该在下次触摸键盘之前去运行?
最佳答案
我不知道有什么特别好的resource ,但这里还是有一些反馈。
new Vehicle() returns an 'Object'.
return {}
覆盖默认返回值 this
,是实例化对象。使用 new
调用此类函数毫无意义,因为 this
会被丢弃。就 OOP 语言而言,JavaScript 有点奇怪,因为它允许您在构造函数中为 this
返回另一个值。
所以是的,以这种方式使用的继承将不起作用:{}
本身不以任何方式链接到父类/基类,这就是为什么
(new Car).move() //undefined
未定义。
关于Javascript 模块模式没有给出正确的 instanceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33456582/