一个看似简单的问题,我在过去的两周内一直在研究和关闭(请放轻松,因为我对这一切都是新手!):
使用Require.js和Revealing Module Pattern时,如何在JavaScript中巧妙地实现继承?
这是一个示例模块,它是某种类型' Component
'的基类:
define('Component', [], function () {
"use strict";
var _privateVar = 10;
var _doPrivateThings = function () { /* do stuff */ };
var init = function () { /* do stuff */ };
var update = function () { /* do stuff */ };
return {
init : init,
update : update
};
});
接下来我要实现CakeComponent
,它应该继承Component
中的所有内容,并允许我编辑/添加方法和属性:
define('CakeComponent', ['Component'], function (Component) {
"use strict";
// Setup inheritance
var CakeComponent = function() {}
CakeComponent.prototype = new Component();
// Add/edit methods/properties
CakeComponent.prototype.newMethod = function () { /* do stuff */ };
return {
init : CakeComponent.init,
update : CakeComponent.update,
newMethod : CakeComponent.newMethod
};
});
首先,我不确定这是否完全合理,但其次,我的CakeComponent感觉有点严重,因为现在我已经到处都有CakeComponent
冗余,而且我已经拥有了重新透露' init
和update
方法。
我真的更喜欢这样的东西(我意识到这没有意义,它只是伪代码):
define('CakeComponent', ['Component'], function (Component) {
"use strict";
this.extends(Component);
var newMethod = function () { /* do stuff */ };
return {
newMethod : newMethod
};
});
任何提示或建议都会非常感激。感谢。
define
包装器中创建一个类对象?我见过人们这样做,但在我遇到这个问题之前似乎没必要。.call()
方法是否有用?例如使用Component.call()
define([], function () {
"use strict";
var Component = function () {
var _privateVar = 10;
var _doPrivateThings = function () { /* do stuff */ };
this.init = function () { /* do stuff */ };
this.update = function () { /* do stuff */ };
};
return Component;
});
答案 0 :(得分:0)
我之前看过这个模型,称为通用模块定义:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['Component'], factory);
} else {
root.CakeComponent = factory(root.Component);
}
}(this, function (Component) {
return {
newMethod: function(){ /* do stuff */ }
};
}));
你可以试试这个,这不是真实的"继承 - 如果它不起作用 - 取决于环境,你可能也需要传递基本函数,这是一个遗憾:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['Component'], factory);
} else {
root.CakeComponent = factory(root.Component);
}
}(this, function (Component) {
return {
init: Component.init,
update: Component.update,
newMethod: function(){ /* do stuff */ }
};
}));
您可以在这篇关于Universal Module Definition
的精彩文章中阅读更多内容