我们创建了一组依赖于Prototype的Class实现(以及一些Object.extend)的类。
问题是原型在与其他应用程序集成时会产生麻烦(即使使用“noconflict”适配器等)。
是否有人知道兼容的Class实现不会影响全局范围?或者是否有人能够“提取”Prototype以单独使用它?
答案 0 :(得分:4)
super
并进行更改。我的实现也使得named functions rather than anonymous ones更容易使用,这有很多原因,这不仅仅是因为它可以帮助您的工具帮助您。它也使私人“阶级”方法变得微不足道。详情如下。
但你不必使用我的。还有其他选项需要稍微更多的工作才能将代码迁移到,但可能不会更多:
我和他们两个的问题是他们使用函数反编译(Prototype的Class
东西也是如此),函数反编译(例如,在函数上调用toString
)从来没有标准化,也没有在一些移动浏览器上工作。如果函数反编译不起作用,Resig的机制会继续工作,但是在这种情况下它会增加每个方法的开销(而不仅仅是那些进行超级调用的方法)。我的机制根本不使用函数反编译,为方法调用添加 no 开销,甚至使超级调用高效。
如果您使用我的机制,您的Prototype代码如下所示:
var SuperThingy = Class.create({
foo: function(arg) {
console.log("SuperThingy: " + arg);
this._pseudoPrivate();
},
_pseudoPrivate: function() {
console.log("I'm not really private.");
}
});
var Thingy = Class.create(SuperThingy, {
foo: function(super, arg) {
console.log("Thingy: " + arg);
super(arg);
}
});
您可以进行微小的更改:
var SuperThingy = Helper.makeClass({
foo: function(arg) {
console.log("SuperThingy: " + arg);
this._pseudoPrivate();
},
_pseudoPrivate: function() {
console.log("I'm not really private.");
}
});
var Thingy = Helper.makeClass(SuperThingy, {
foo: function(arg) {
console.log("Thingy: " + arg);
this.callSuper(arguments, arg);
}
});
...或者您可以进行稍微更大的更改,并获得速度提升的好处(callSuper
使用arguments.callee
,慢),正确命名的功能(用于调试等)和真正的私有函数:
var SuperThingy = Helper.makeClass(function() {
function SuperThingy_foo(arg) {
console.log("SuperThingy: " + arg);
trulyPrivate.call(this);
}
function trulyPrivate() {
console.log("I'm truly private.");
}
return {foo: SuperThingy_foo};
});
var Thingy = Helper.makeClass(SuperThingy, function() {
function Thingy_foo(arg) {
console.log("Thingy: " + arg);
foo.$super.call(this, arg);
}
return {foo: Thingy_foo};
});
答案 1 :(得分:0)
Prototype源尝试模块化,因此您可以单独下载lang/class.js。但是,快速浏览代码会显示它取决于lang/array.js,lang/object.js,lang/function.js中的函数 - 抓住prototype.js和所有lang会更安全} 目录。这为你提供了Prototype的核心,没有相互冲突的DOM。
我也发现Class
类太有用了。我被建议尝试Sugar nice ,但仍然没有继承权。目前唯一真正的替代方案是MooTools' class。
答案 2 :(得分:0)
你应该看看: MyJS class system
我想你会喜欢的!
答案 3 :(得分:0)
在尝试ComposeJS之后,我无法找到一种显式调用超类构造函数的方法(它们会被自动调用),所以我不得不放弃它。我最终确定了JsFace,它有许多功能(继承,mixins,静态属性,AOP),虽然调用超类构造函数的方法有点奇怪:这个。$ class。$ super.call(args)。根据它的网站以及benchmark,它似乎也是最快的实现,完全消除了Resig实现,这非常缓慢。值得注意的是这个。$ class。$ super总是最终子类的超类,所以你可能需要这样做:
var C = Class(A, {
constructor: function (x) {
C.$super.call(this, x);
},
...
}

而不是
var C = Class(A, {
constructor: function (x) {
this.$class.$super.call(this, x);
},
...
}

就像示例一样,如果你有多个级别的继承,否则你将获得无限递归。