模块化 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
方法的输入。
我正在尝试在 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
方法的输入。