模块化 JS 和原型继承

Modular JS and Prototypal Inheritance

我正在尝试在 JS 中学习 prototypal inheritance。一个模块是否可以借鉴另一个模块的原型?

到目前为止,我唯一能做到的是通过 prototype chain 访问它。比方说,第一个模块还没有创建任何东西,我的第二个模块只是 sol?

举个例子:

var Cars = (function ( make, serial ) {
 var obj = {};
 
 var Car = function () {
  this.make = make;
  this.serial = serial;
 }

 Car.prototype.drive = function () {
  console.log('vrrrooom')
 }

 obj[ serial ] = new Car()
 return {obj:obj}

}( 'Toyota', '12345' ))

var Vans = (function ( make, serial ){
 var obj = {}

 var Van = function () {
  this.make = make;
  this.serial = serial;
 }

 Van.prototype = Object.create ( Cars.obj[ '12345' ] )

 obj[ serial ] = new Van()
 return {obj:obj}

}( 'Ford', '6789' ))

// So the Toyota drives?
console.log( Cars.obj )
Cars.obj[ '12345' ].drive() // Cool!


// Maybe my Ford can too?
console.log( Vans.obj )
Vans.obj[ '6789' ].drive() // Cool, but what if there were no Cars?

Vans.obj[ '6789' ]上调用drive方法时,JS首先检查对象本身是否有这个属性。它没有,所以它检查它的原型 Cars.obj[ '12345' ]。它也没有此方法,因此检查了那个对象 Car.prototype 的原型。该方法在那里找到并在 Vans.obj[ '6789' ] 对象上执行。

如果 Cars.obj[ '12345' ] 在执行此行时未定义:

Van.prototype = Object.create ( Cars.obj[ '12345' ] )

JS 会抛出错误,因为 undefined 不允许作为 Object.create 方法的输入。