2016-09-30 7 views
0

以下のコードでは説明できない動作に気付いています。私は誰かがなぜこれが起こっているのかについて私に啓発できることを願っています。Javascript:nullコンストラクタを使用して作成されたオブジェクトの未定義を示すデフォルトのプロトタイプフィールド

次のコード例は、JSFiddleでも読みやすくなっています。 https://jsfiddle.net/0b5rh4cg/

コード:

function Book() { 

}; 

function Book (title, author) { 
    this.title = title; 
    this.author = author; 
}; 

Book.prototype = { 
    title: "", 
    ISBN: "isbn", 
    length: 100, 
    genre: "genre", 
    covering: "covering", 
    author: "author", 
    currentPage: 0, 

    toString: function toString() { 
    console.log("toString Function"); 
    console.log('Title: ' + this.title + '\n' + 
          'ISBN: ' + this.ISBN + '\n' + 
          'length: ' + this.length + '\n' + 
       'genre: ' + this.genre + '\n' + 
       'covering: ' + this.covering + '\n' + 
       'author: ' + this.author + '\n' + 
       'currentPage: ' + this.currentPage + '\n'); 
    } 
}; 

var book1 = new Book(); 
book1.toString(); 

var book2 = new Book("First edition", "Random"); 
book2.toString(); 

book1.toString() のtoString関数の出力 タイトル:未定義 ISBN:ISBN 長さ:100 ジャンル:ジャンル カバー:カバー 作成者:undefined currentPageに:0

book2.toString() のtoString関数の出力 タイトル:初版 ISBN:ISBN 長さ:100 ジャンル:ジャンル カバー:カバー 著者:ランダム 現在のページ:0

私の混乱は、著者とタイトルフィールドを囲んでいます。 nullコンストラクタでは、これらのフィールドのデフォルトはBookクラスのプロトタイプに設定されているものではなく、「未定義」です。

これを手伝ってくれてくれてありがとう。

Cheers、Cam。

+0

JSはパラメータ多型をサポートしていません。第2の 'book'は最初のものを上書きします。 – georg

答えて

1

JavaScriptは、異なる名前またはパラメータタイプを持つ場合、同じ名前のメソッドまたは複数のコンストラクタを持つことができるJava(または他のプログラミング言語)と似ていません。この場合は、あなたが望むものを達成するためにBook(title, author)

Book()を交換してきたあなたはこのような何か行うことができ、この場合には

function Book (title, author) { 
    this.title = title||""; 
    this.author = author||""; 
}; 

を、titleauthorは空Stringにデフォルト設定されます。

またはこのような何か:あなたは、関数コンストラクタで定義

function Book (title, author) { 
    this.title = title && author ? title : ""; 
    this.author = title && author ? author : ""; 
}; 
+0

私はあなたの言うことを見ます、タイタス​​。情報のおかげで。 –

+0

@CameronMcKay私は、幸運を助けることができるとうれしいです。 – Titus

1

プロパティは常にプロトタイプに定義されたものを上書きします。

Whey JavaScriptエンジンがプロトタイプ値を提供していますが、プロトタイプチェーンよりも、インスタンス上で最初にそれを探します(hasOwnProperty)。

あなたは暗黙的に関数コンストラクタにタイトルと作者を宣言しているため、新しい演算子はそれにこの2つのプロパティを持つオブジェクトをcratedオブジェクトは次のようになりますので、インスタンススペースです:

ブックス{ タイトル:未定義、自動 :不定、 プロト:{ タイトル: ""、 ISBN: "ISBN"、 長さ:100、 ジャンル: "ジャンル"、 被覆は "カバー"、 著者: "著者"、 currentPageに:0、 プロト:オブジェクト }}

だから、ときに最初、未定義のように初期化されたインスタンス上のものを返します。JavaScriptエンジンを依頼されたプロパティを使用して作成されたときに渡される引数なし理由新規

+0

これは本当に素晴らしい情報です。ありがとう@fistuks! –

+0

もっと知りたい場合は、MDNのプロトタイプチェーンを読むことをお勧めします。[link](https://developer.mozilla.org/en/docs/Web/JavaScript/Inheritance_and_the_prototype_chain) – fistuks

1

あなたの最初のブック機能

function Book (title, author) { 
    this.title = title; 
    this.author = author; 
}; 

では、あなたは何に渡しているので、パラメータは未定義のと機能に入ります。 タイトル著者の両方を宣言しているので、この場合は両方ともに値が割り当てられています。この場合はは未定義です。

ブックオブジェクトの最初のルックアップでは、未定義の戻り値を取得するので、両方のは、値を持っているあなた宣言されたプロパティを打ちます。 書籍の両方の値に値があるため、ルックアップは停止し、おそらく予想通りプロトタイプチェーンを伝播しません。

でなく、が呼び出された関数にパラメータを渡しているときに、デフォルト値を設定したい場合は、これを関数に追加してください。

function Book (title, author) { 
    this.title = title || ""; 
    this.author = author || "author"; 
} 
+1

パズル@SoEzpZの部分。他の2つのこの回答は、元の質問に対する非常に詳細で完全な答えを提供します。 –

関連する問題