ホームページ  >  記事  >  ウェブフロントエンド  >  javascriptconstructor_javascriptスキルの強制呼び出しの体験まとめ

javascriptconstructor_javascriptスキルの強制呼び出しの体験まとめ

WBOY
WBOYオリジナル
2016-05-16 17:47:31783ブラウズ

次のコンストラクターは非常に興味深く定義されました:

コードをコピー コードは次のとおりです:

var Coder = function( nick ){
this.nick =
};

コンストラクターを定義した後はどうなりますか?
var coder = Coder( 'casper' );
このコーダー兄弟の名前は何ですか?すぐに印刷します:
コードをコピー コードは次のとおりです:

console.log( coder .nick ) ; //未定義
= =b は実際には未定義です。 !インスタンス化ステートメントを振り返ると、問題がどこにあるかを見つけるのは難しくありません。新しい
var coder = Coder( 'casper' ); // 通常の関数として呼び出されるので、内部の this ポインターが欠落しています。実際にはウィンドウ オブジェクトを指します
console.log( window.nick); //出力: casper
var coder = new Coder( 'casper' ); //new ではすべてが異なりますが、これは正しく指します。現在作成されているインスタンス
console.log( coder.nick ); //出力: casper

このポインタのポインティングの問題については、この記事では説明していません。
このようなエラーは非常に低レベルに見えますが、発生する可能性は非常に高いです。どうすればこの状況の発生を回避または軽減できるでしょうか。
内部実装を試してみることができます:
コードをコピーします コードは次のとおりです:

var Coder = function( nick ){
if( !(このインスタンスの Coder) ){
return new Coder( nick );
this.nick = nick; >};


実際には、インスタンス化するときに、this が指すオブジェクトの型が現在のコンストラクターの型ではない場合に内部で決定されます。また強制的に呼び出される。
突然、Coder という名前があまりおしゃれではないと感じませんか? Hacker を使用したい場合は、変更します。 。 。数えてみると、変更する必要があるものが 3 つあります。これは非科学的です。コンストラクターの名前を変更するだけで済みますか?
もちろん:


コードをコピーします コードは次のとおりです:
var Coder = function( nick ){
if( !(arguments.callee のインスタンス) ){
return new argument.callee( nick );
this.nick = nick;



ヒント
: ES 5 の厳密モードでは argument.callee が無効になると言われていますが、これは ES 5 が人気があり、厳密モードを使用するように指定した場合に限ります。それ以外の場合は、引き続き使用できます。JQ には、次のように、無敵の $ が含まれています。
var jObject = $('#node_id');ここにも新しいものがないことに気づきましたか?何が起こったのか推測できたはずです。原理は似ていますが、内部の実装はさらに複雑です。JQ の実装を取り外して、時間があるときに概要を書きます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。