我正试图从Prototype转移到jQuery,最后一件事我无法弄清楚如何在新库中做到。
这是我以前用Prototype做的事情:
MyClass = Class.create();
MyClass.prototype = {
initialize: function(options) {
}
}
然后我可以创建一个新的MyClass
:
var mc = new MyClass({});
jQuery是否有像Prototype的Class.create()
这样的东西?如果没有,如何在没有图书馆的情况下获得同样的东西?
答案 0 :(得分:15)
我使用jquery extend函数来扩展类原型。
例如:
MyWidget = function(name_var) {
this.init(name_var);
}
$.extend(MyWidget.prototype, {
// object variables
widget_name: '',
init: function(widget_name) {
// do initialization here
this.widget_name = widget_name;
},
doSomething: function() {
// an example object method
alert('my name is '+this.widget_name);
}
});
// example of using the class built above
var widget1 = new MyWidget('widget one');
widget1.doSomething();
注意:我向related question询问了同一主题。
答案 1 :(得分:5)
jQuery使用标准的javascript功能来创建新类。
网上有一些很好的例子,但我建议你查看David Flanagan的书籍Javascript:The Definitive Guide。
JavaScript and Object Oriented Programming (OOP)
我道歉,我完全误解了你原来的帖子。我猜你真的想知道如何扩展jQuery $对象。这很容易实现,有很多插件用于这样做。 jQuery网站上有一个教程:Getting Started With jQuery
但基本上,你使用
jQuery.fn.foobar = function() {
// do something
};
答案 2 :(得分:3)
jQuery没有定义OOP原语,所以你是独立的。但是用简单的JavaScript很容易做到你想做的事情:
MyClass = function(options){
// whatever were in your initialize() method
};
您可以像以前一样创建实例:
var mc = new MyClass({});
如果你曾经在原型中有更多的东西,你可以像以前一样添加它们:
MyClass.prototype = {
// no need for initialize here anymore
/*
initialize: function(options) {
},
*/
// the rest of your methods
method1: function() { /*...*/ },
method2: function() { /*...*/ }
}
或者,您可以动态添加方法:
$.extend(MyClass.prototype, {
method1: function() { /*...*/ },
method2: function() { /*...*/ }
});
最后,您可以提供自己的班级创建者:
var CreateClass = function(){
return function(){ this.initialize.apply(this, arguments); };
};
// the rest is a copy from your example
MyClass = CreateClass();
MyClass.prototype = {
initialize: function(options) {
}
}
var mc = new MyClass({});
答案 3 :(得分:2)
在JavaScript中,如果与'new'关键字一起使用,常规函数将充当构造函数。
所以你可以做到,
function MyClass(options)
{
this.options = options;
};
MyClass.prototype.initialize = function() { } ;
MyClass.prototype.sayHello = function() { alert('Hello!'); };
var item = new MyClass( { id : 10 } );
item.sayHello(); //alerts Hello!
alert(item.options.id); //alerts 10.
我建议您尝试了解JavaScript的实际工作原理。尝试understand prototype inheritance as opposed to class based inheritance。对JavaScript的良好理解将帮助您充分利用该语言的强大功能。
答案 4 :(得分:1)
您基本上可以从原型的源代码中复制相关部分,并保留有关扩展的部分。 http://github.com/sstephenson/prototype/blob/add69978e09653808aedec43ed551df22818ee30/src/lang/class.js
jQuery没有这样的对象创建和扩展系统,因为整个系统似乎依赖于jQuery链接(对于jeresig:抱歉,如果我弄错了)。所以你必须创建自己的系统。
为了获得一个想法,Douglas Crockford有一个众所周知的模式,用于在JavaScript中创建对象和继承。 http://javascript.crockford.com/prototypal.html
答案 5 :(得分:1)
John Resig的一个很好的解决方案: Simple JavaScript Inheritance
答案 6 :(得分:0)
您可以使用标准JavaScript:
MyClass = function(options) {
console.log(options);
};
var mc = new MyClass([1,2,3]);
您可以使用jQuery提供继承:http://docs.jquery.com/Utilities/jQuery.extend#deeptargetobject1objectN
答案 7 :(得分:0)
你可以尝试JS.Class(可移植的,模块化的JavaScript类库) - http://jsclass.jcoglan.com/
答案 8 :(得分:0)
我认为,有一种更简单的方法......
function Dashboard() {
var dashboard = this;
dashboard.version = 'Version 0.1';
dashboard.__init = function() {
console.log('init');
};
dashboard.__init();
}
var dash = new Dashboard();
will log 'init'
答案 9 :(得分:-1)
从来没有做过,但我想看看一些插件,比如Thickbox可能会有所帮助。
答案 10 :(得分:-1)
John Resig的精彩Classy Query插件提供了您正在寻找的内容: