OOP通常需要实例化(在使用之前创建类的实例),如下所示:
var x = new String();
在jQuery(和其他框架)中,我们可以使用没有实例化的对象,例如(没有'new'):
$('#myid').click(function(){
//code
});
这是我的问题:框架作者如何制作?如何在没有“新”实例化的情况下使框架可以使用?
提前致谢!!
答案 0 :(得分:5)
最简单,最有用的答案(遗漏了很多关于JavaScript与基于类的语言的不同之处)是从jQuery函数创建并返回一个新对象。
您将在jQuery源代码中看到的第一件事:
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
}
您可以看到$
只是源代码中jQuery
的别名:
// Expose jQuery to the global object
return (window.jQuery = window.$ = jQuery);
答案 1 :(得分:3)
javascript是prototype based language,没有继承 - 所有行为都是通过克隆对象和/或将新字段附加到现有对象来实现的。
在你给出的例子中
$('#myid').click(function(){
//code
});
你实际上是将一个匿名函数传递给click
函数,该函数被定义为jQuery库定义的对象的内部函数 - 它是通过全局参数化$
函数创建的(内部函数)使用new
,正如@lwburk在他的回答中指出的那样)。函数是javascript中的一等公民 - 它们可以直接使用,也可以作为对象的一部分使用,然后使它们看起来好像是外部对象中的方法:
[object returned by function]
$ ('#myid') .click( function() {} );
^ ^ ^
function parameters inner function ^ parameter of type function
答案 2 :(得分:2)
您可以创建一个包含自调用函数的方法。
(function() {
var iAm = window.iAm || {};
iAm = {
Awesome: function()
{
alert('Yea you are!');
},
Lame: function()
{
alert('aww man.');
}
};
window.iAm = iAm;
})();
iAm.Awesome(); // will alert "Yea you are!"
iAm.Lame(); // will alert "aww man."
答案 3 :(得分:0)
JavaScript是一种动态的,脚本化的,基于原型的语言。实例化和内存管理来自解释器。
答案 4 :(得分:0)
由于JS是原型,功能和无类,因此new
关键字与其他语言略有不同。
之间的区别
var D = new Dog();
和
var D = Dog();
使用new
关键字将返回它正在调用的对象。
考虑一下:
function Dog() {
// a property
this.breed = "chocolate lab";
// a method
this.bark = function(){
alert("woof");
}
}
然后你可以调用方法并从对象中提取属性。
var D = new Dog();
D.breed; // [string] 'chocolate lab'
D.bark(); // alerts "woof"
答案 5 :(得分:0)
根据Crockford学校的说法,要接受JavaScript的真正原型性质,你必须废除伪古典元素,例如new
运算符或.prototype
引用。
虽然lwburk在jQuery中是正确的,$()
只是一个包装器,但实际上你可以在没有new
的情况下“实例化”一个对象。
var myClass = function () {
var privateVar,
instance = {
member: 'foo',
method: function () {
privateVar = 'bar';
}
};
return instance;
};
var newInstance = myClass();