【问题标题】:Modular JS and Prototypal Inheritance模块化 JS 和原型继承
【发布时间】:2016-08-06 13:15:06
【问题描述】:

我正试图在 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?

【问题讨论】:

    标签: javascript prototypal-inheritance modular


    【解决方案1】:

    当在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 方法的输入。

    【讨论】:

    • 太好了,所以我添加了这些行,返回 {obj:obj, drive: Car.prototype}, Van.prototype = Object.create ( Cars.drive )。这样就搞清楚了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2013-05-20
    • 2013-02-04
    • 2014-01-02
    相关资源
    最近更新 更多