🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

578閲覧

開眼!JavaScriptのprototypeプロパティの値にプリミティブ値を設定の記述

mxa

総合スコア5

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

2グッド

4クリップ

投稿2019/12/20 16:52

開眼!JavaScriptの112ページに、
「prototypeプロパティの値にはオブジェクトを設定することができます。プリミティブ値を設定しようとした場合、その宣言は無視されます」と書いていますが、以下のコードのようにプリミティブ値も設定できるので、この記述は間違いでしょうか?

JavaScript

1let a = function(){}; 2a.prototype = 10; 3console.log(a.prototype); // 10
nico25, miyabi_pudding👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

その書籍は読んでないのですが、「Ctro.prototype にプリミティブを代入」というのが気になりました。
(普通は使わない手法です)。

プリミティブ値を設定しようとした場合、その宣言は無視されます

以下のように実験してみました。

  1. prototype にプリミティブを代入した コンストラクタ関数A(ご質問の内容)
  2. prototype は弄らない コンストラクタ関数B
  3. Object の インスタンスについてチェック

( Edge, Firefox, Chrome で確認)

// 1. function A(){}; A.prototype = 10; console.log( (new A()).__proto__ ); // { constructor:, ... } console.log( (new A()).__proto__.constructor ); // Object console.log( (new A()).__proto__.__proto__ ); // null //console.log( (new A()).__proto__.__proto__.constructor ); // エラー:コメントアウト console.log( A.prototype ); // 10 // 2. function B(){}; console.log( (new B()).__proto__ ); // { constructor:, ... } console.log( (new B()).__proto__.constructor ); // B console.log( (new B()).__proto__.__proto__ ); // { constructor:, ... } console.log( (new B()).__proto__.__proto__.constructor ); // Object // 3. let oj = {}; console.log( oj.__proto__ ); console.log( oj.__proto__.constructor ); // Object console.log( oj.__proto__.__proto__ ); // null

実装の結果(仕様まで確認できていませんが)、「コンストラクタ関数 A が無かったことにされている」ことが分かります。捉えようで不可解にも感じますが、書籍の1文も間違ってはいない表現だと思います。

prototype プロパティは、継承を行うなど、プロトタイプチェーンに大きく影響する特別なプロパティと認識すべきで、プリミティブの代入は行わないほうが懸命です(実装の変化に弱いとも言えそう)。

追記)
実験と結果報告からの意見しか回答できませんでしたが
この回答にコメントくださった maisumakunさん、dameoさんの意見も参考にしてください。

投稿2019/12/20 21:43

編集2019/12/21 10:45
AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AkitoshiManabe

2019/12/21 00:32

仕様のリンクありがとうございます
退会済みユーザー

退会済みユーザー

2019/12/21 10:20

少し説明が必要だと思ったので補足します。 maisumakunさんのおっしゃる「別の値」とはObject.prototypeのことで、結果としてnew A()で出来るオブジェクトの__proto__がObject.prototypeになるということにつながります。 本来なら__proto__はA.prototypeになるのですが、代入された値10はオブジェクトでなく不適切なので、無視され、デフォルト値のObject.prototypeが使用されたということです。 なおコンストラクタそのものは消えておらず、普通に動作します。
mxa

2019/12/21 15:20

ありがとうございます。『開眼!JavaScript』の112ページには説明がなくて、NOTEとして付け足しのように書いてあるだけだったので、何のことかと思っていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問