web-dev-qa-db-ja.com

javascript:関数とオブジェクト...?

関数をオブジェクトとして呼び出すことはできますか?例えば:

function Tip(txt){      
    this.content = txt;  
    this.shown = false;  
}

そして:

var tip = new Tip(elem.attr('title'));

私の質問:

  1. オブジェクトのように、関数のnewを呼び出すことはできますか?
  2. seオブジェクトとして機能するため、 "this"の使用が可能になります。
41
Paul

すべての関数には、thisへの参照があります。 Tip()を呼び出すと、thisはグローバルオブジェクトを参照します。 new Tip()を呼び出すと、Tip.prototypeへの参照を持つ新しいオブジェクトが作成され、thisはその新しいオブジェクトを参照します。

オブジェクトでnewを使用することはできません。たとえば、_new {}_は_TypeError: object is not a function_をスローします。 new Object()を参照している場合、Objectは関数であるため機能します。

19
Adam Bergmark

はい。 JavaScriptでは、技術的にはすべてがオブジェクトです。 newを使用すると、Tipオブジェクトのインスタンスが作成され、Tip関数がコンストラクターであるかのように呼び出されます。

Tipオブジェクトに関数を追加する場合は、次のようにTipのプロトタイプに追加する必要があります。

Tip.prototype.getContent = function() {
    return this.content;
};

あなたがそれを持っているなら、あなたはそれをします:

var tip = new Tip("this  is my content.");
alert(tip.getContent());

「これは私のコンテンツです」というメッセージが表示されます。

ただし、オブジェクトに機能的な実装がある場合にのみ、newを使用できます。したがって、これは機能しません:

var Tip = { content: txt, show: false };
var tipObj = new Tip();
6
Tom Chandler

私はこれらの概念(オブジェクトとしての機能、プロトタイプオブジェクト、__ proto__プロパティ、コンストラクタープロパティ)を8年近く(2008-2016)理解するのに苦労しました。最初に、第6章、第8章、第9章を何度も読んだ後、4〜5年間、David Flanaganの「JavaScript Definitive Guide 5/6th ed」を開始しました。私には何の意味もありませんでしたが、インターネット上で苦労した後、関数(プロパティを持つ典型的なC++関数)をオブジェクトとして管理できるものがいくつかありました。オブジェクトにはメソッドもあるためです。そして幸運なことに、2015年の7年目に、Wrox Nicholas C. Zakasの「Web開発者向けのプロフェッショナルなJavaScript第3版」第6,7章を開始しました。そして、上記の4つの概念を理解することは本当に役に立ちました。従来、C/C++/C#の関数はオブジェクトを変更するものと考えられています。言い換えれば、「何かをする」ために作られ、オブジェクトは、自身のオブジェクトの状態を変更するメソッドを使用して、グローバルな実行コンテキストの状態を維持するために作られます。もし関数がファーストクラスのオブジェクトになり得るなら、なぜオブジェクトは関数のようになれないのでしょうか?

ここでの主要な質問はなぜですか? 「連想機能」や「連鎖引数」のような単一の概念エンティティではないのはなぜですか?そして、ここに私の理解があります:ブラウザexeはシングルスレッドアプリケーションであり、このexeは事前定義されたスコープチェーン(引数を持つコマンドの文字列に似たもの)でJSインタープリターの呼び出しを制御します。実行時にJSエンジン(インタープリターではない)がコードを巻き上げ方式でロードします(メインメソッドがないため、キーワードコードとその呼び出しが明確に定義されているため)。このホイストされたコードでは、関数がオブジェクトとして扱われない場合、c/c ++/c#(マルチスレッドと無制限のメモリのbcoz)で簡単に可能ですが、JSではなく、別々の呼び出しコンテキスト(スコープチェーン外)で維持する必要があります。したがって、「連鎖オブジェクトでやるべきこと」は、Javaスクリプト関数をファーストクラスオブジェクトとして作成します。実際、JSオブジェクトも同じことを行います。唯一の違いは、「オブジェクトの呼び出し」ではありません「関数の呼び出し」が意味のある連鎖コンテキストであるオブジェクトにあります。関数は、「アドレスlink(chain)を持つアセンブリ言語命令を持つ変数の束」と考えることもできます。 -> bottomlinking(プロトタイプオブジェクト)vs bottom-> toplinking(__ proto__ property)vs object blue print-> object instances(constructor property)。数か月前、リンクを理解するのに役立つ次の画像が見つかりました。

http://judis.me/wordpress/wp-content/uploads/2015/08/JavaScriptDiagram.png "JSオブジェクトモデル"

3
Saurabh

この関数は、クラスのコンストラクターとして機能しています。または、次のこともできます。

_function Tip(txt) {
 return {
 content: txt,
 shown: false
}
}
_

var myTip = new Tip("my epic tip");を使用して新しいインスタンスを取得します。これは、たとえばc#に似ています。

_public class Tip {
string text = "";
public Tip(string txt) {
text = txt;
}
}
_

だから、並べ替えます。 1)関数は基本的にクラスとして機能しているため、newを呼び出しています。2)thisはクラスの現在のインスタンスを参照しています。

1
Thomas Shields

#1の場合:Function(capital F)というオブジェクトがあります

var f = new Function( "x"、 "y"、 "return x * y;");

#2の場合:「this」は呼び出しパターンによって異なります(Douglas Crockfordによる)。 Crockfordは、4つのパターン(method pattern、function pattern、constructor pattern、および "apply" pattern)があると述べました

1
user670800
  1. 実際、配列や関数などのすべてのデータ型はオブジェクトです。
  2. 関数をクラス宣言としてとると、これは機能します。
0
xblymmx