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

はい、それは関数オブジェクトです。javascriptのすべてのオブジェクトはプロパティを持つことができ、同様$.fn.collapsedefaults

nameすべての関数[object]には、関数の名前(名前が付けられている場合)を含む書き込み不可能なプロパティがあるため、フィドルは機能しません。my_object名前が空の変数に無名関数を割り当てています。文字列であり、ではないことに注意してくださいundefinedhttp://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 に答える