Javascript jQuery等实例化
OOP通常需要实例化(在使用之前创建类的实例),如下所示:Javascript jQuery等实例化,javascript,jquery,oop,Javascript,Jquery,Oop,OOP通常需要实例化(在使用之前创建类的实例),如下所示: var x = new String(); 在jQuery(和其他框架)中,我们可以使用对象而无需实例化,例如(无“新建”): 我的问题是:框架作者是如何做到的??如何在没有“新”实例化的情况下使框架准备好使用 提前谢谢 javascript是一种不存在继承的语言,所有行为都是通过克隆对象和/或将新字段附加到现有对象来实现的 在您给出的示例中 $('#myid').click(function(){ //code }); 实际上,您
var x = new String();
在jQuery(和其他框架)中,我们可以使用对象而无需实例化,例如(无“新建”):
我的问题是:框架作者是如何做到的??如何在没有“新”实例化的情况下使框架准备好使用
提前谢谢 javascript是一种不存在继承的语言,所有行为都是通过克隆对象和/或将新字段附加到现有对象来实现的
在您给出的示例中
$('#myid').click(function(){
//code
});
实际上,您正在向click
函数传递一个匿名函数,该函数定义为jQuery库定义的对象上的内部函数,该函数是通过全局参数化$
函数创建的(该函数内部使用@lwburk在回答中指出的new
)。函数是javascript中的第一类公民-它们可以直接使用,也可以作为对象的一部分使用,这使它们看起来像是外部对象中的方法:
[object returned by function]
$ ('#myid') .click( function() {} );
^ ^ ^
function parameters inner function ^ parameter of type function
JavaScript是一种基于原型的动态脚本语言。实例化和内存管理来自解释器。您可以创建一个用自调用函数包装的方法
(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."
最简单的答案(忽略了JavaScript与基于类的语言的区别)是创建一个新对象并从jQuery函数返回
(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."
您将在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);
由于JS是原型、函数和类,因此
new
关键字与其他语言略有不同
两者的区别
var D = new 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"
根据Crockford学派的观点,要接受JavaScript真正的原型本质,必须废除伪经典元素,如
new
操作符或.prototype
引用
虽然lwburk在jQuery中的这一点是正确的,$()
只是一个包装器,但您实际上可以“实例化”一个对象,而不必使用new
var myClass = function () {
var privateVar,
instance = {
member: 'foo',
method: function () {
privateVar = 'bar';
}
};
return instance;
};
var newInstance = myClass();
但是“新”呢??通常使用“新建”创建实例!大多数情况下都不需要它。@DrStrangeLove-Daniel说得对,严格地说,JavaScript中不需要
new
,但实际上jQuery使用new
来创建一个新对象,该对象被分配给jQuery
和$
对象。看我的答案。你说“通过克隆对象(原型)”是什么意思?如果你说为每个实例创建了一个重复的prototype对象,那是不对的。@patrick看起来我也需要对javascript原型进行复习,你之前的回答非常有用。我不知道你问的是“#myid”
字符串还是jQuery对象。你在这里写的东西在很多方面都是错误的。首先,为了按预期工作,myClass应该是一个函数,而不是一个文本对象。即使您纠正了这一点,您也会无意中创建一个全局变量实例。最后一点不是是否使用new
:这只是调用函数的一种不同方式(即,newfoo()
通常不等同于foo())
。你不应该废除new
而继续使用构造函数。你能做的就是尽量避免使用构造函数,而只将它们用于继承。此注释太短,无法在这一点上展开。对不起,我确实忘记了函数头。请给我指一些在此基础上展开的资源。我很好奇。
var myClass = function () {
var privateVar,
instance = {
member: 'foo',
method: function () {
privateVar = 'bar';
}
};
return instance;
};
var newInstance = myClass();