2017-11-03 2 views
0

JSクラスのパターンを学習し、プロトタイプではなくクラス内の関数ではなく、ある例を見つけようとしています。プロトタイプではなく、クラスに関数があるのはいつですか?

Example 1 

class SomeClass { 
    constructor() {...} 
    someMethod() { 
    ... 
    } 
} 

Example 2 

class SomeClass { 
    constructor() {...} 
} 

SomeClass.prototype.someMethod = function() { ... } 

私の理解は、実施例1において、SomeClassの各インスタンスは、SomeClass共有someMethodのすべてのインスタンスを、実施例2における一方someMethodを有することです。だから...私のように思える...あなたがクラスを作成しているなら、共有メソッドを持つのは全体のポイントではないのですか?

は、あなたが例あなたが探している用語は、「インスタンスメソッド」や「独自方式」で1

+1

内で定義されている場合

同じことは、*のSomeClass.prototype *に*のsomeMethod *置くどちらの例には、彼らはちょうど同じ結果を達成するために異なる構文を使用し、ボンネットの下に起こります。 – RobG

+0

それはただの好みです。クラスはjsの現行バージョンで導入された新しいものです。クラスの前には、コンストラクタのプロトタイプを使用する必要があります。classキーワードが実装される方法は、古いプロトタイプのメカニズムを取り巻く薄いラッパーにすぎないので、Example1とExample2の両方がまったく同じことを行います。 – slebetman

答えて

0

をしたいと思います理由の具体的な例を提供してください、それは(コンストラクタメソッドなど)これは、「クラス」の各インスタンスに配置されるメソッドです。

Javascriptにはクラスがありませんが、クラス構文はあります。クラスの構文を介して行われるすべてがそう、伝統的な機能とプロトタイプの構文を使用してもを行うことができます。

class SomeClass { 
    constructor() {} 
    someMethod() {} 
    static staticMethod() {} 
} 

は同じです:あなたは、インスタンス/独自のメソッドを使用する場合は

function SomeClass() { 
    // constructor body here 
} 

SomeClass.prototype.someMethod = function() {}; 

SomeClass.staticMethod = function() {}; 

、それはコンストラクタに添付する必要があります。

function SomeClass() { 
    this.instanceMethod = function() {}; 
} 

または

class SomeClass { 
    constructor() { 
    this.instanceMethod = function() {}; 
    } 
    ... 
} 

クロージャーに保持されているプラ​​イベートデータにアクセスできる特権メソッドを作成するインスタンスメソッドを使用したい場合があります。初期の記事はDouglas CrockfordのPrivate Members in JavaScriptですが、他にも多くの参照があります(そのうちのいくつかはCrockfordの作業より前です) 。

考慮する:ここで

function SomeClass(privateValue) { 
    this.privilegedFn = function() { 
    console.log(this.privateValue); 
    } 
} 

を、privateValueの値は、privilegedFnを介してのみアクセス可能であり、すべてのインスタンスのために異なっていてもよいです。

+2

私は彼らが「自分の方法」、一種の「所有財産」と呼ばれていたと思っていましたが、良い書きかけです。 – dandavis

+0

@ dandavis-sure、更新されました。 – RobG

0

どちらも本質的に同じです。 classは新しいやり方です。

同じ方法で、thisSomeclassポイントから作成されたすべてのオブジェクトは、メソッドを呼び出したオブジェクトにバインドされるものの

SomeClass.prototype.someMethod = function() { ... } 

を行います。したがって、方法はが完全な意味でを共有していません。コンテキストは常にオブジェクトに固有です。この方法は、あなたが間違っているclass

関連する問題