2011-01-29 7 views
2

私はまだjQueryを学んでいますが、jQueryを使うほどオブジェクト指向ではなく手続き型に見えます。たとえば、私はjQueryクラスを見たり使ったりしていないと思いますが、内部的に使われているクラスもあります。私がしているのは、オブジェクトを自分で構築するのではなく、メソッド連鎖です。例えば新しいFoo()。また、jQuery documentation for plug-in developmentはクラスについても言及していません。jQueryは手続きですか?

jQueryは、jQueryベースのライブラリを書くときに関数とメソッドのみを公開し、カスタムクラスを内部に保持することを奨励していますか?私は、jQueryプラグインの作成については説明しませんが、各アプリケーション固有のカスタムライブラリです。

私はJavaから来ているので、ここで混乱しています。

+0

(1)JSにはクラスがありません。 (2)オブジェクトを使わず*メソッド*をどのように連結できますか? ;)それらの構造に文字newが含まれていないからといって、オブジェクトを作成したり使用したりしているわけではありません。 – delnan

+0

jQueryは* OOよりも優れています! –

答えて

5

jQueryは、主にDOM API上の単なるレイヤーであり、反復と列挙のための便利なメソッド(each()など)と結合されています。それは、DOM APIの中でぎこちないものと思われるものと、実装間で一貫性が欠けていることを確かにするものです。

フレームワークではなく、言語ではありません。 DOM APIよりも優れたエクスペリエンスを提供するのは、まさにそこにあります。

これはjavascriptにあるOOP機能を利用していますが、それ自体は特定のプログラミングパラダイムを提供していません。その領域にもっと集中しているprototypejsunderscoreのような他のライブラリがあります。

+2

jQueryのための+1はフレームワークではなくライブラリです。アンダースコア&プロトタイプへのリンクを追加してください。 – Raynos

+0

@レイノス:助けてくれてありがとう。 :o) – user113716

+0

コメントを残した直後に編集するのに十分な担当者を得ました。o) – Raynos

5

jQueryは多くのOOの手続きです。

$(domNode)は、新しいjQueryオブジェクトを返します。ソースを調べると、jQueryメソッドはnewオブジェクトを返します。

$(domNode).fooは、jQueryオブジェクトのメソッドを呼び出します。

classというキーワードがないということであなたは混乱しています。

function Constructor() { 
    this.constructed = true; 
} 

var o = new Constructor; 
alert(o.constructed); 

newキーワードが使用されている限り、関数はオブジェクトコンストラクタとして使用されます。 JavaとJavaScript OOの間には非常に大きな違いがあります。 JavaScriptは、クラスベースの継承ではなく、プロトタイプの継承を使用します。

jQueryの連鎖は、図のように行われますhere。 jQueryオブジェクトで呼び出されるすべてのメソッドは、jQueryオブジェクトを返します。

$(obj).css("foo").attr("bar"); // we can call both methods on $(obj) 

var o = $(obj).css("foo"); // .css returns $(obj) 
alert(o[0] === $(obj)[0]); // o & $(obj) point to the same DOM node 
o.attr("bar"); 
+0

これは、私が質問から解釈した(私の言うことではない)少し異なる視点を取ります。 jQueryがどのように使用されているのかとは対照的に、jQueryがどのように実装されているかについての洞察を得るため+1です – user113716

+0

@patrickdw彼は、jQueryソースが手続き型スタイルで書かれていると言っていると思っていました。 – Raynos

+0

+1どうすればできないのですか? :) – GolezTrol

2

jQueryが明確に言語ではないため、ドキュメントにはClassやこのようなものは言及されていません。 Javascriptで書かれたAPIで、JavascriptはPrototype programing languageです。

+0

jQueryの+1は言語ではありません。また、プロトタイプ言語は依然としてオブジェクト指向です。 – Raynos

+1

jQueryは実際には言語ではありません。人々はそれを忘れています。 :)しかし、それは*言語*で書かれており、手続き的またはオブジェクト指向のスタイルで書かれているので、質問は非常に有効です。 Tomは、jQueryが言語そのものであることはどこにも示唆していませんでした。 – GolezTrol

+0

@Raynos原因のそれはOOです私はそうではないと言わなかった。 :) – mathk

1

jQueryがあなたを悩ませているのではなく、JavaScriptです:) JavaScriptはプロトタイプベースの言語で、OOスタイルは少し異なります。プロトタイプを使って実際にシミュレートされたOOです(詳細は、ここをクリックしてください - http://en.wikipedia.org/wiki/JavaScript#Prototype-based

jQueryはOOと多く関係しています。 $機能は、実際のjQueryオブジェクトを作成するためのファクトリメソッドです - あなたはあなた自身に$で始まるnew Foo()

ものを書いていない理由です。ユーティリティメソッドによく似ています。jQueryの実際OOある

$.each([1,2,3], function(){ 
    document.write(this + 1); 
}); 
1

:jQueryのマッピング機能(ウィキペディアから)例えば 。たぶん、JavaScriptのクラスが少し違って見えるので、クラスが見えなかったかもしれません。

// Yes, this function is actually a class constructor. 
function Demo(a) 
{ 
    // A property is declared easily and can be unset as well. 
    this.a = a; 
} 

// You can add functions to the prototype, but you can also 
// declare functions and assign them to this.functionName in the constructor. 
Demo.prototype.test = function() 
{ 
    alert(this.a); 
} 

d = new Demo('Hello world'); 
d.test(); 

だから単語「クラス」またはそのような「オブジェクト」または何かがそこことはない、と今でも私はオブジェクト指向モデルを使用しています:彼らは実際には少し余分を持つ関数です。 また、任意の変数がウィンドウオブジェクトのプロパティであるように、任意の '緩い'関数は実際にはウィンドウオブジェクトのメソッドです。 JavaScriptは完全にOOですが、その事実を隠すことは非常に困難です。 :D

+0

@GolezTroi loose関数はウィンドウオブジェクトのプロパティです。 @Raynos、 – Raynos

+0

、意味があります。私は実際にここで学んでいます。 :) – GolezTrol