47

JavaScriptを使用すると、関数をオブジェクトとして扱うことができます。最初に変数を関数として定義すると、後でその関数にプロパティを追加できます。どのように逆を行い、「オブジェクト」に関数を追加しますか?

これは機能します:

var foo = function() { return 1; };
foo.baz = "qqqq";

この時点でfoo()、関数を呼び出し、foo.baz値は「qqqq」になります。

ただし、最初にプロパティの割り当て部分を実行する場合、その後、変数に関数をどのように割り当てますか?

var bar = { baz: "qqqq" };

bar.baz値「qqqq」を持つよう 調整し、関数を呼び出すために、今何ができbar()ますか?

4

8 に答える 8

29

ここで混乱するのは簡単ですが、あなたは(簡単にまたは明確に、または私が知る限り)あなたが望むことをすることはできません。うまくいけば、これは物事を片付けるのに役立つでしょう。

まず、JavascriptのすべてのオブジェクトはObjectオブジェクトから継承します。

//these do the same thing
var foo = new Object();
var bar = {};

第二に、関数はJavascriptのオブジェクトです。具体的には、これらはFunctionオブジェクトです。FunctionオブジェクトはObjectオブジェクトから継承します。関数コンストラクターをチェックアウトする

var foo = new Function();
var bar = function(){};
function baz(){};

変数を「オブジェクト」として宣言すると、それを関数オブジェクトに変換することはできません(簡単に、明確に、または私が知る限り)。Function型の新しいオブジェクトを宣言し(関数コンストラクターを使用して、変数に無名関数を割り当てるなど)、古いオブジェクトからメソッドのプロパティをコピーする必要があります。

最後に、考えられる質問を予想して、何かが関数として宣言されたとしても、(私が知る限り)functionBody/sourceを変更することはできません。

于 2008-09-23T23:27:40.520 に答える
25

それを行う標準的な方法はないようですが、これは機能します。

なぜ、しかし、問題です。

function functionize( obj , func )
{ 
   out = func; 
   for( i in obj ){ out[i] = obj[i]; } ; 
   return out; 
}

x = { a: 1, b: 2 }; 
x = functionize( x , function(){ return "hello world"; } );
x()   ==> "hello world" 

これを達成する方法は他にありません。

x={}
x() 

「タイプエラー」を返します。「x」は「オブジェクト」であり、変更できないためです。やろうとするのと同じくらい賢明です

 x = 1
 x[50] = 5
 print x[50] 

うまくいきません。1 は整数です。整数には配列メソッドがありません。あなたはそれを作ることができません。

于 2008-09-23T22:46:58.607 に答える
4

オブジェクト型は関数であり、オブジェクト自体は関数のインスタンス化です。

alert([Array, Boolean, Date, Function, Number, Object, RegExp, String].join('\n\n'))

表示 (FireFox):

function Array() {
    [native code]
}

function Boolean() {
    [native code]
}

function Date() {
    [native code]
}

function Function() {
    [native code]
}

function Number() {
    [native code]
}

function Object() {
    [native code]
}

function RegExp() {
    [native code]
}

function String() {
    [native code]
}

特に、 Function オブジェクトfunction Function() { [native code] }は再帰関係 (それ自体を使用した再帰的な定義) として定義されていることに注意してください。

また、回答 124402#124402は について不完全であることに注意してください1[50]=5。これはプロパティを Number オブジェクトに割り当て、有効な Javascript です。観察、

alert([
  [].prop="a",
  true.sna="fu",
  (new Date()).tar="fu",
  function(){}.fu="bar",
  123[40]=4,
  {}.forty=2,
  /(?:)/.forty2="life",
  "abc".def="ghi"
].join("\t"))

ディスプレイ

a   fu  fu  bar 4   2   life    ghi

Javascript の "Rules of Engagement" に従って正しく解釈して実行する。

もちろんシワは必ずあり=ます。オブジェクトは、変数に割り当てられたときに、本格的なエンティティではなく、その値に「短絡」されることがよくあります。これは、ブール オブジェクトとブール値の問題です。

明示的なオブジェクト識別により、この問題が解決されます。

x=new Number(1);  x[50]=5;  alert(x[50]);

「オーバーロード」は非常に正当な Javascript の演習でありprototyping、コードの難読化が危険である可能性があるなどのメカニズムで明示的に承認されています。

最後の注意:

alert(  123 . x = "not"  );

alert( (123). x = "Yes!" );  /* ()'s elevate to full object status */
于 2011-05-23T14:24:17.387 に答える
1

一時変数を使用します。

var xxx = function()...

次に、元のオブジェクトからすべてのプロパティをコピーします。

for (var p in bar) { xxx[p] = bar[p]; }

最後に、古いプロパティを持つ新しい関数を元の変数に再割り当てします。

bar = xxx;
于 2008-09-23T22:48:39.960 に答える
1

注意:私が問題を解決した方法のスタイルで書かれた投稿。OPの場合に使用できるとは100%確信が持てません。

サーバー上で作成され、JSON / ajax によってクライアントに配信されるオブジェクトを変換する方法を探しているときに、この投稿を見つけました。

これにより、事実上、クライアントでインスタンスを作成できるように関数に変換したいオブジェクトである OP と同じ状況に陥りました。

最後に、私はこれを思いつきました。これは機能しています(少なくともこれまでのところ):

var parentObj = {}

parentObj.createFunc = function (model)
{
    // allow it to be instantiated
    parentObj[model._type] = function()
    {
        return (function (model)
        {
            // jQuery used to clone the model
            var that = $.extend(true, null, model);
            return that;
        })(model);
    }
}

これは次のように使用できます。

var data = { _type: "Example", foo: "bar" };
parentObject.createFunc(data);
var instance = new parentObject.Example();

私の場合、実際には、結果のオブジェクト インスタンスに関連付けられた関数を持ち、インスタンス化時にパラメーターを渡すことができるようにしたいと考えていました。

だから私のコードは:

var parentObj = {};
// base model contains client only stuff
parentObj.baseModel =
{
    parameter1: null,
    parameter2: null,
    parameterN: null, 
    func1: function ()
    {
        return this.parameter2;
    },
    func2: function (inParams) 
    {
        return this._variable2;
    }
}

// create a troop type
parentObj.createModel = function (data)
{
    var model = $.extend({}, parentObj.baseModel, data);
    // allow it to be instantiated
    parentObj[model._type] = function(parameter1, parameter2, parameterN)
    {
        return (function (model)
        {
            var that = $.extend(true, null, model);
            that.parameter1 = parameter1;
            that.parameter2 = parameter2;
            that.parameterN = parameterN;
            return that;
        })(model);
    }
}

そして、次のように呼ばれました。

// models received from an AJAX call
var models = [
{ _type="Foo", _variable1: "FooVal", _variable2: "FooVal" },
{ _type="Bar", _variable1: "BarVal", _variable2: "BarVal" },
{ _type="FooBar", _variable1: "FooBarVal", _variable2: "FooBarVal" }
];

for(var i = 0; i < models.length; i++)
{
    parentObj.createFunc(models[i]);
}

そして、それらを使用できます:

var test1 = new parentObj.Foo(1,2,3);
var test2 = new parentObj.Bar("a","b","c");
var test3 = new parentObj.FooBar("x","y","z");

// test1.parameter1 == 1
// test1._variable1 == "FooVal"
// test1.func1() == 2

// test2.parameter2 == "a"
// test2._variable2 == "BarVal"
// test2.func2() == "BarVal"

// etc
于 2016-06-12T17:19:35.997 に答える
-1
var bar = { 
    baz: "qqqq",
    runFunc: function() {
        return 1;
    }
};

alert(bar.baz); // should produce qqqq
alert(bar.runFunc()); // should produce 1

あなたはこれを探していると思います。

次のように書くこともできます:

function Bar() {
    this.baz = "qqqq";
    this.runFunc = function() {
        return 1;
    }
}

nBar = new Bar(); 

alert(nBar.baz); // should produce qqqq
alert(nBar.runFunc()); // should produce 1
于 2010-10-26T21:36:02.813 に答える
-1

JavaScript では、関数をオブジェクトとして扱うことができます。関数にプロパティを追加できます。逆に、オブジェクトに関数を追加するにはどうすればよいでしょうか?

あなたは少し混乱しているようです。JavaScript の関数オブジェクトです。そして、変数variable です。あなたはこれがうまくいくとは思わないでしょう:

var three = 3;
three = 4;
assert(three === 3);

...では、関数を変数に割り当てると、以前の値が何らかの形で保持されることを期待するのはなぜですか? おそらく、いくつかの注釈があなたのために物事を明確にするでしょう:

// assigns an anonymous function to the variable "foo"
var foo = function() { return 1; }; 
// assigns a string to the property "baz" on the object 
// referenced by "foo" (which, in this case, happens to be a function)
foo.baz = "qqqq";
于 2008-09-23T22:39:22.697 に答える