如何初始化JavaScript函数

时间:2011-01-23 18:18:49

标签: javascript jquery

我的理解是JavaScript中的函数可以具有状态。有些州只需要初始化一次。你是如何做到这一点的,这样调用函数不会重新初始化它们?

例如,jQuery中的$()是一个函数,而不是一个对象,但它似乎有状态并且就像一个对象。

我考虑为此创建一个对象,但我想要的是一个外观函数,就像$()的工作方式一样。

3 个答案:

答案 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;

当然,这些属性也可以是对象构造函数。