我的理解是JavaScript中的函数可以具有状态。有些州只需要初始化一次。你是如何做到这一点的,这样调用函数不会重新初始化它们?
例如,jQuery中的$()
是一个函数,而不是一个对象,但它似乎有状态并且就像一个对象。
我考虑为此创建一个对象,但我想要的是一个外观函数,就像$()
的工作方式一样。
答案 0 :(得分:6)
功能是对象。他们可以拥有属性:
function F() {}
F.key = "value";
alert(F.key) // "value"
您还可以将函数用作 new
调用的构造函数:
function F(val) { this.key = val; }
var instance = new F("value")
alert(instance.key) // "value"
您可以看到的差异是,第一个版本只向key
函数对象添加F
成员,而第二个版本在每个key成员>实例由 new
F
创建。
当您通过 new
调用某个功能时,会自动创建实例对象,并可通过this
关键字进行扩充。默认情况下,每个构造函数都返回this
。
您还可以向函数prototype
添加公共方法,它们将可用于所有实例。他们可以使用this
关键字单独更改其“状态”(如您所说)。
function F(val) { this.state = val; } // unique
F.prototype.change = function() { this.state = "stuff"; }
var inst = new F("value")
var inst2 = new F("value")
alert(inst.state) // "value"
alert(inst2.state) // "value"
inst.change();
alert(inst.state) // "stuff"
alert(inst2.state) // "value"
<强>的jQuery 强>
我甚至可以告诉你jQuery在幕后做了什么,但我认为你真的不想知道。 :)
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
},
// ...
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
// ...
},
// ...
};
// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
所以基本上$(selector)
表示 new
jQuery.fn.init(selector)
,这只是一个更容易打字的快捷方式(同时也是为了防止评论中提到的“错误”) fogetting new
将this
绑定到全局对象,而不是当前实例。
此外,添加为jQuery.fn.ext
的所谓插件已映射到jQuery.fn.init.prototype
,如您在最后一行中所见,它是另一种快捷方式。因此,当您致电$(selector)
时,添加到jQuery.fn
的所有内容也会显示在jQuery.fn.init.prototype
上,因此新实例会将这些方法设为$(selector).ext(...)
。
// as you use it today
jQuery.fn.plugin = function ( ... ) { ... }
$(selector).plugin( ... )
// as it would be without shortcuts
jQuery.fn.init.prototype.plugin = function ( ... ) { ... }
(new jQuery.fn.init(selector)).plugin( ... )
答案 1 :(得分:0)
如果您想限制多次调用某个函数,我建议您实现singleton pattern
答案 2 :(得分:-1)
JavaScript是完全面向对象的,基于原型的语言。完全我的意思是一切都是一个对象,包括数组,数字和所谓的函数:
var number = 32.1245;
alert(number.toFixed(2)); // 32.12
基本上,当您使用function
关键字定义函数时,您实际上是在定义object constructor。在内部对象构造函数中,您可以使用this
定义对象的 public 属性:
function Car(model) {
this.model = model;
this.productionYear = new Date().getFullYear();
}
var car = new Car("Audi A8");
car.productionYear = 2009;
当然,这些属性也可以是对象构造函数。