関数をオブジェクトとして呼び出すことはできますか?例えば:
function Tip(txt){
this.content = txt;
this.shown = false;
}
そして:
var tip = new Tip(elem.attr('title'));
私の質問:
new
を呼び出すことはできますか?すべての関数には、this
への参照があります。 Tip()
を呼び出すと、this
はグローバルオブジェクトを参照します。 new Tip()
を呼び出すと、Tip.prototypeへの参照を持つ新しいオブジェクトが作成され、this
はその新しいオブジェクトを参照します。
オブジェクトでnew
を使用することはできません。たとえば、_new {}
_は_TypeError: object is not a function
_をスローします。 new Object()
を参照している場合、Object
は関数であるため機能します。
はい。 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();
私はこれらの概念(オブジェクトとしての機能、プロトタイプオブジェクト、__ 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オブジェクトモデル"
この関数は、クラスのコンストラクターとして機能しています。または、次のこともできます。
_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の場合: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)があると述べました