JSでnewでSymbolを作成できないのはなぜですか

js の多くの基本データ型はnewで作成できますが、新しい js データ型である Symbol はこの方法では作成できないことに注意してください。リテラルの代わりにラッパー オブジェクトを取得するために、 new を使用して基本的なデータ型を作成できます。

Java の new String("hello") と "hello" の違いに似ています。

これはnewで作成された別のポイントなので、Symbol 型のパッケージ オブジェクトを取得することを公式が望んでいないことが推測できます。ただし、ラッパー オブジェクトは Object() メソッドを介して取得できます。
いくつかの拡張機能を次に示します。

new を使用してオブジェクトを作成することと、new を使用せずにオブジェクトを作成することの違い

MDN のドキュメントでは、次の説明を確認できます。

  1. 空の単純な JavaScript オブジェクト (つまり {}) を作成します。
  2. ステップ 1 で新しく作成されたオブジェクトに属性protoを追加し、この属性をコンストラクターのプロトタイプ オブジェクトにリンクします。
  3. ステップ 1 で新しく作成したオブジェクトをthisのコンテキストとして使用します。
  4. 関数がオブジェクトを返さない場合は、これが返されます。

つまり、 new Foo() は基本的に Foo() メソッドを呼び出しますが、 new キーワードはそれにいくつかの追加操作を実行します。このことから、次の結論を導き出すことができます。

Symbol は、新しいキーワードが内部で使用されていることをどのように認識していますか?

newを使用するかどうかを判断する方法は多数ありますが、ここでは、Symbol() 関数が次のようであると仮定します。

function Symbol(){
    
    
	//native code here
	if(this instanceof Symbol){
    
    
		throw new Error('Uncaught TypeError: A is not a constructor')
	}
}

newキーワードはオブジェクトを返し、__proto__ はプロトタイプ オブジェクトを指すため、エラーが発生します
ただし、Symbol() メソッドが値を返す場合のみ、そのデータ型は基本データ型 'symbol' です。instanceof を使用するには、少なくとも左側のオペランドがオブジェクト型である必要があるため、戻り値は false であり、エラーは報告されません。 .

おすすめ

転載: blog.csdn.net/weixin_55658418/article/details/128802465
おすすめ