その書籍は読んでないのですが、「Ctro.prototype にプリミティブを代入」というのが気になりました。
(普通は使わない手法です)。
プリミティブ値を設定しようとした場合、その宣言は無視されます
以下のように実験してみました。
- prototype にプリミティブを代入した コンストラクタ関数A(ご質問の内容)
- prototype は弄らない コンストラクタ関数B
- 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/21 00:12
2019/12/21 00:32
退会済みユーザー
2019/12/21 10:20
2019/12/21 15:20