2

我试图理解以下模式:

// https://github.com/twitter/bootstrap/blob/master/js/bootstrap-collapse.js

  $.fn.collapse = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('collapse')
        , options = typeof option == 'object' && option
      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.collapse.defaults = {
    toggle: true
  }

它看起来像collapse一个函数对象。那么,为什么defaults可以作为属性添加到collapse?

以下(jsFiddle) 片段尝试向函数对象添加新属性,但无济于事。它是什么?

var my_object = function () {
    alert('Hello World!');
};
my_object.name = 'my_object';

console.log(my_object.name);  // prints an empty string
4

3 回答 3

2

是的,它是一个函数对象$.fn.collapsejavascript 中的所有对象都可以有属性,defaults.

你的小提琴不起作用,因为每个函数 [object] 都有一个不可写的name属性,其中包含函数的名称 - 如果它被命名的话。my_object您正在为具有空名称的变量分配一个匿名函数。请注意,它一个字符串,而不是undefined! 看看http://jsfiddle.net/KTzUw/3/

于 2012-11-12T22:32:34.683 回答
2

.name是特殊的,大多数其他属性名称都有效:

var my_object = function () {
    alert('Hello World!');
};
my_object.someprop = 'my_object';
console.log(my_object.someprop);  // prints an empty string

函数的name属性是保留的。

function foo() {};
console.log(foo.name); // "foo"

在您的情况下,它是一个空字符串,因为它被声明为匿名函数:

var foo = function() {};
console.log(foo.name); // ""

但是除了一些保留的属性名称之外,是的,您可以像分配任何对象一样分配函数的属性。这可能非常强大,因为它可以让您以一种非常干净的方式将数据与需要该数据的代码联系起来。

于 2012-11-12T22:32:43.983 回答
1

name是函数实例的保留属性,具有不可配置不可写标志,您不能覆盖它。除此之外,函数也确实继承自Object并且可能具有属性。

var my_fnc = function() { };

my_fnc.foobar = 42;

console.log( my_fnc_foobar ); // 42
于 2012-11-12T22:33:39.257 回答