2016-06-29 5 views
1

JavaScriptオブジェクトを深く理解して学習しています。私はObject prototypeを以下の例で学んだ。上記の例で関数のメソッドをfunction.prototypeのように直接追加できないのはなぜですか?

var MyObj = function(){ 
    this.Name = "Stackoverflow"; 
} 

MyObj.prototype.prop = "OK"; 

var instance = new MyObj(); 
instance.prop = "OK"; 

console.log(instance.hasOwnProperty("Name")); //true 
console.log(Object.getOwnPropertyNames(instance)); //[ 'Name', 'prop' ] 

instanceオブジェクトはObjectgetOwnPropertyNamesにアクセスすることはできません。 getOwnPropertyNames関数はObjectのプロトタイプのメンバーではないためです。これに続いて、私は自分のオブジェクトを書くときに上記のようにObjectのようにします。

var MyDream = function(){} 
MyDream.prototype.canAccessThisMethod = function(x){}; 

var instanceSample = new MyDream(); 

instanceSample.canAccessThisMethod("blabla"); //because of prototype 
MyDream.method(blabla); // didn't work. 

MyDream.methodをこの例で使用するにはどうすればよいですか?

+1

ようこそStackOverflow。まず最初に、いくつかのこと、良いプロトタイプを学びたいと思っていますが、とにかくここで 'function'にメソッドを追加することはありません。しかし、あなたは途中でこれらの事を回避するでしょう。 – Rohit416

+0

ここにはJavaScriptのプロトタイプに関するチュートリアルがあります。(https://www.pluralsight.com/blog/software-development/understanding-javascript-prototypes) – Rohit416

答えて

1

のすべてのオブジェクトに追加されることを意味し、聞かせてスニペットで尋ねたことに重点を置いています。つまり、

var MyDream = function(){} 
MyDream.prototype.canAccessThisMethod = function(x){ }; 

var instanceSample = new MyDream(); 

instanceSample.canAccessThisMethod("blabla"); //because of prototype 
MyDream.method(blabla); //How can we write "MyDream.method" in this example 

ステップバイステップで進めてください。

var MyDream = function(){} 

匿名関数を作成し、変数MyDreamに割り当てました。 Functions are first class objects in JavaScript。彼らは強力で柔軟性があります。最初のクラスのオブジェクトであれば、そうした変数に変数を割り当てることができます。それらをパラメータとして渡すことができます。その上で、あなたはまた、私はあなたがそう詳細をスキップして早送りでこのステートメントに移動するものの残りの部分を考え出したと信じて

MyDream.prototype.canAccessThisMethod = function(x){ }; 

としてそこプロトタイプチェーンを拡張することができます。

MyDream.method(blabla); 

残念ながら、これは機能しません。その理由は、function as methodを追加するには、それを関数リテラルとして割り当てる必要があるからです。 Objectsのように機能するメソッドを追加できます。

MyDream.method = function(x) { 
    console.log(x); 
} 

MyDream.method("bla bla"); 
+0

こんにちはRohit416。返信ありがとう。あなたは "MyDream.method"は動作しないと言った。これは、リテラル関数としてのみ機能します。私はここに何の問題も理解していない。私はObject.getOwnPropertyNamesがどのように機能するのだろうか? – mrkiyak

+0

継承されたオブジェクトのアクセスできないメソッドをリテラル関数として書くことは可能ですか? – mrkiyak

+0

_ "Object.getOwnPropertyNamesのしくみ" _別の目的を持っています。オブジェクト。また、組み込み型はすべてObjectのインスタンスとして扱われます。 'function'プロトタイプは実際には' function(){} 'を最終的に指す' Object'です。 – Rohit416

1

あなたは、たとえば、これを行うことができます。

instanceSample.prototype.method = function(x){ 
... 
} 

プロトタイプメソッド「メソッドは」クラス「MyDream」別にprototypesを説明するから

関連する問題