2016-09-20 4 views
1

JavaScriptの関数は、新しいオブジェクトをインスタンス化するために使用できるものを、コンストラクタを持つプロトタイププロパティを持つオブジェクト以外にはありません。JavaScriptの関数とオブジェクトと関数のないインスタンス化

しかし、次の操作を行うことはできません。私の意見では

let Pear = { 
    prototype : Object.prototype 
}; 
let p = new Pear(); //Throws "caught TypeError: Pear is not a constructor" 

が、これは全く同じようにする必要があります:どのような作品

function Pear() { 

} 
let p = new Pear(); 

。 私はちょうど違いがどこにあるのだろうかと思っています。私の最初の方法のための修正はありますか? "関数"は "実際の"オブジェクトではなく、扱い方が異なりますか?それは本当に単なる好奇心です。実際には何も重要ではありません...

答えて

2

newが動作するオブジェクトは[[Construct]]内部メソッドを実装する必要があります。それ以外の場合は、TypeError例外が発生します。

オブジェクトのリテラル構文で生成​​されたオブジェクトと組み合わせてnewを使用することはできません。

しかし、もしそのようなものを定義しているのであれば、にはがほしいとは思わないでしょう。前者のプロパティを含む新しいオブジェクトをObject.assign()で作成できます。

let p = Object.assign({}, Pear); 

また、別の方法でオブジェクトのプロトタイプを変更することもできます。

+0

私も理解したこと:JavaScriptには2種類のオブジェクトがあります。機能オブジェクトとオブジェクトオブジェクト。関数オブジェクトには、()で呼び出すことができる評価可能なコンテンツを含む特別なプロパティ(文字列)があります。通常のオブジェクトにはこのプロパティが含まれていません。 Object-ObjectをFunction-Objectに変換することは可能ではないようです。 – David

関連する問題