【问题标题】:Minimalistic prototype (js framework)极简原型(js框架)
【发布时间】:2011-06-16 01:52:56
【问题描述】:

我想将原型 javascript 框架用于其“类”和继承功能。对于其他一切,我将使用 jQuery。是否有一个极简版本的原型可以给我这个功能?如果我不会全部使用它,我不想要整个库的额外开销。

具体来说,我想要类和继承功能,使我能够按如下方式定义类(来自维基百科的示例):

var FirstClass = Class.create( {
  // The initialize method serves as a constructor
  initialize: function () {
   this.data = "Hello World";
  }
});

并扩展另一个类:

MyNewClass = Class.create( FirstClass, { 
  //Override the initialize method
  initialize: function() { 
    //..
  }, 
  // ...more methods add ... 
});

另外我不希望框架之间发生冲突(即 $ 应该 only 由 jQuery 使用..我只想要原型(或任何其他建议都可以)来创建类/继承)。

【问题讨论】:

  • 嗯,这些究竟是什么类和继承能力?你能举个例子吗?因为通常情况下,太阳底下的任何事物都有一个 jQuery.... 你不会把它和 JS 原生的 prototype 关键字混为一谈吗?
  • 如果你想要一个好的面向对象的框架,我会看看 mootools。
  • 就像我提到的。我想将 jQuery 用于大多数功能。但是 jQuery 不允许我很好地定义类(使用构造函数),这些类会自动分配给原型(可以选择扩展类等)。我可以为此编写自己的功能,但使用原型框架等成熟的东西似乎更有意义
  • Ian,我个人认为 jQuery 不是 JS 框架的最佳选择。 Prototype 在语法上优于 jQuery,并提供与 jQuery 相同的功能。
  • @Max 我建议 mootools 超过原型的主要原因是它在性能上更接近 jquery,并且您可以获得面向对象的优点。原型很慢。

标签: javascript prototypejs prototype-programming


【解决方案1】:

Inheritance.js 是开发 Prototype 库的人的灵感来源,我认为这正是您所要求的。

注意:$super 似乎是 this.parent,如下面的 cmets 所述。

【讨论】:

  • 希望我可以将原型交换为继承.js,但看起来他们没有像原型那样的 $super。
  • 没用,因为没有 $super 和减少的功能。
  • @UweHeim 乍一看似乎有this.parent,在我看来与原型中的$super 相同
  • 是的,我没查过,但如果你这么说,应该是差不多的。
  • 是的,他们使用 this.parent 而不是 $super。但是你不能仅仅因为这个而将 Prototype.js 换成 Inheritance.js。
【解决方案2】:

如果您正在寻找简约的东西:

function clone(obj)  {
    if(typeof obj !== 'undefined') {
        clone.prototype = obj;
        return new clone;
    }
}

function copy(dest, src) {
    for(var name in src) {
        if(src.hasOwnProperty(name))
            dest[name] = src[name];
    }
}

function classof(constructor) {
    return {
        extend : function(base) {
            constructor.prototype = clone(base.prototype);
            return this;
        },

        mixin : function(members) {
            copy(constructor.prototype, members);
            return this;
        }
    };
}

示例用法:

// base class:
function Foo(value) {
    this.value = value;
}

classof(Foo).mixin({
    inc : function() { ++this.value; }
});

// derived class:
function Bar() {
    Foo.apply(this, arguments);
}

classof(Bar).extend(Foo).mixin({
    dec : function() { --this.value; }
});

var bar = new Bar(42);
bar.inc();
bar.dec();

【讨论】:

    【解决方案3】:

    不要混合使用 Prototype 和 jQuery。我的经验表明他们在一起玩得不好。由于语法糖更好,我个人更喜欢使用 Prototype。

    没有办法禁用 Prototype 的 $-function。您可以通过 jQuery.noConflict() 禁用 jQuery 对 $ 的使用 - 但它并不完美。

    正如@mhtiza 所说,如果您决定坚持使用 jQuery,请使用 Interitance.js 作为类糖。

    【讨论】:

    • 坚持使用原型也是如此。如果你只需要 jQuery,那就坚持下去,但是一旦涉及到更大的原型,那么 jQuery 就会被淘汰(IMO)并且变得多余。
    【解决方案4】:

    对于 1.7.1 版本,我删除了prototype.js 文件中第 1625 行以下的所有内容,并且我不再与 bootstrap 和 jquery 发生冲突。 Class.create 函数仍然有效。 class.create 也是我想要的唯一方法。

    【讨论】:

    • 我没有测试一切,但乍一看,它就像一个魅力。你们所有的 jquery 用户,他们只是在寻找更好的类支持,这可能是一个可行的选择。
    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 2011-05-28
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多