替换Prototype.js类系统

时间:2011-09-29 08:27:59

标签: javascript prototypejs

我们创建了一组依赖于Prototype的Class实现(以及一些Object.extend)的类。

问题是原型在与其他应用程序集成时会产生麻烦(即使使用“noconflict”适配器等)。

是否有人知道兼容的Class实现不会影响全局范围?或者是否有人能够“提取”Prototype以单独使用它?

4 个答案:

答案 0 :(得分:4)

几年前我wrote one(我应该重温它,并给它一个正确的名称),因为我不喜欢Prototype在“超类”上调用方法的处理,这涉及到每次调用重写方法时创建函数(是的,真的)。除了你如何制作超级电话之外,它与Prototype非常相似;您可以随时将其放入并在代码中搜索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.jslang/object.jslang/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);
  },
  ...
}




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