2017-11-13 13 views
0

したがって、インスタンスに効果的に影響するコンストラクタを変更するためにprototypeプロパティを適用する方法を知っています。理論的には、プロトタイプは通常の関数でも動作するはずです(ただし、特定のインスタンスのプロトタイプでない場合は必ずしも効果がありません)。だから、私は、これは実際にXXが機能に追加された方法として、何を思ったんだけどjavascript - コンストラクタではない関数にプロトタイプを適用すると、どのような影響がありますか?

createNewPerson.prototype.xx = (function() { //alerts hello 
      alert("hello"); 
     })(); 

(完全なコードは末尾にある)(createNewFunctionはコンストラクタではありません通常の関数である)のコードを試してみました。それはanon関数と等しい変数xxとして格納されていますか?またはthis.xx =関数として格納されていますか?どのようにこれは、次のコードを格納することに比較します:

createNewPerson.xx = (function() { //alerts hello 
     alert("hello"); 
    })(); 

をこれも、私はそれがするvarミリメートル= 3として保存されます、またはそれがない場合は、この行は、のように(保存する方法をこれにと思ってしまいます全く追加):?

createNewPerson.mm = 3; 

完全なコードを参照するために:

function createNewPerson(name) { 
 
    var obj = {}; 
 
    obj.name = name; 
 
    obj.greeting = function() { 
 
    alert('Hi! I\'m ' + this.name + '.'); 
 
    }; 
 
    return obj; 
 
} 
 

 
createNewPerson.mm = 3; //does nothing when i tested it  
 

 
createNewPerson.xx = (function() { //alerts hello 
 
    alert("hello"); 
 
})(); 
 
createNewPerson.prototype.xx = (function() { //alerts hello 
 
    alert("hello"); 
 
})(); 
 
var salva = createNewPerson('Salva');

+0

あなたは全然ここに任意の機能を割り当てていません。あなたは[IIFEの戻り値](https://stackoverflow.com/questions/26092101/what-is-this-javascript-pattern-called-and-why-is-it-used)を割り当てています! – Bergi

+0

参照:https://stackoverflow.com/help/someone-answers – c0der

答えて

1

.prototypeは、他のオブジェクトプロパティと同じように単なるオブジェクトプロパティです。ファンクションにはデフォルトで1つのファンクションがあり、(たとえばコンストラクタを使用して)特定の方法でオブジェクトを作成すると、その.prototypeプロパティに特別な方法で間接的にアクセスできます。しかし、不動産そのものや物件の割り当てについては魔法はありません。

createNewPerson.prototype.xx = (function() { //alerts hello 
    alert("hello"); 
})(); 

これは、「こんにちは」と警告し.prototypeプロパティの.xxプロパティに値undefinedを割り当てます。

anon関数と同じ変数xxとして保存されていますか?

undefinedに等しいプロパティxxとして保存されています。

createNewPerson.xx = (function() { //alerts hello 
    alert("hello"); 
})(); 

これは、「こんにちは」と警告する機能自体の.xxプロパティに値undefinedを割り当てます。

これはまた、私はこの本のラインが格納される方法として思ってしまう

(それがするvarミリメートル= 3として格納する場合と同様に、あるいはそれがすべてで追加していないのだろうか?):

createNewPerson.mm = 3; 

あなたが言ったことは本当にわかりませんが、これはすべて、関数自体のプロパティに値3を割り当てています。

+0

プロパティとして格納されているとしたら、var x = literalまたは{"x":value} – user8783104

+0

@ user8783104を意味します。後者を意味します。 – JLRishe

+0

なぜそれは未定義ですか? – user8783104

0

関数はオブジェクトであり、プロパティを持つことができます。

function createNewPerson(name) { 
 
    var obj = {}; 
 
    obj.name = name; 
 
    obj.greeting = function() { 
 
    alert('Hi! I\'m ' + this.name + '.'); 
 
    }; 
 
    return obj; 
 
} 
 

 
createNewPerson.mm = 3; //assigns 3 to createNewPerson property mm 
 

 
createNewPerson.xx = (function() { //assigns result of anonymous function to property xx 
 
    alert("hello"); 
 
})(); 
 
createNewPerson.prototype.xx = (function() { //assigns result of function to xx 
 
    alert("hello"); 
 
})(); 
 
var salva = createNewPerson('Salva');//creates new generic object 
 

 

 
alert(// these are values of the function, not the object salva 
 
    'mm: ' + createNewPerson.mm + 
 
    '\nxx: ' + createNewPerson.xx 
 
); 
 

 
//To add a function to a function: 
 

 
createNewPerson.foo = function(){ 
 
    alert('I\'m just a function hanging off another function. I know nothing about the function I hang on.'); 
 
}; 
 
alert('the above code didn\'t alert, but we can alert it now'); 
 
createNewPerson.foo();

機能に新しいメンバーをアタッチすると、それらに機能への特別なアクセス権を与えるものではありません。

更新: createNewPerson( 'Salva')を呼び出すと、コンテキストは「ウィンドウ」です.mmで取得する唯一の方法は、createNewPerson.mmを参照することです。

"this.mm"のような短いものを探している場合は、コードを更新してコンテキストをバインドすることができます。私はこれを反映するために更新されたコードを追加しました。

var createNewPerson = (function (name) { 
 
    alert(this.prior); 
 
    alert(this.after); 
 
    var obj = { name: name }; 
 
    return obj; 
 
}); 
 

 

 
createNewPerson.prior = 'prior to binding'; 
 

 
createNewPerson=createNewPerson.bind(createNewPerson); //this makes the createNewPerson its own context when it is called. 
 

 
createNewPerson.after = 'after to binding';//property is hung from the function instance created with "bind" 
 
var person = createNewPerson('salva');

+0

ありがとう! createNewPerson.mm = 3のとき。関数が関数{mm = 3 ..}または関数{'mm':3、}のように見えますか? – user8783104

+0

@ user8783104これらのどちらも有効なJavaScript構文ではないので、どちらも...? – JLRishe

+0

次に、関数内のプロパティを定義するのと同等のものは何ですか?このケースではcreateNewPerson.mm = 3となります。 – user8783104

0

それはあなたがjsのコンストラクタの構文を探している可能性がありように思えます。関数へのプロパティの代入だけではありません。

//function with a property 
 
function foo(){ 
 

 
} 
 
foo.prop = true; 
 
alert(foo.prop); 
 

 

 
//maybe you want a constructor? 
 
function constructor(id) { 
 
    this.id = id; 
 
} 
 
var thing = new constructor(32); 
 
alert(thing.id);

関連する問題