Javascript解惑のnew A.B()とnew A().B()の違い

2965 ワード

new A.B()とnew A().B()は違いがありますが、これはみんな知っています.なぜかというと、前からよく分かりませんでした.
この問題に関する知識面では、点演算子、new演算子、関数がこの3つの間の優先度を実行するという問題があります.
new A.B()の論理はこうです.
new A.B()
new演算子よりも点演算子の方が先になるのは、それだけらしい.
new A().B()の論理はこのようです.
(new A().B();
ではなく
new(A().B)()
違いはAの後ろに小さい括弧が一つ増えています.これは優先順位に影響します.
ECMAScript標準ではnew演算子(11.2.2)とfunction calsについての説明は以下の通りです.
11.2.2 The newOperator
The productionewExpression:new NewExpressions evaluated as follows:
  • Letrefbe the result of evaluating NewExprestion.
  • Let construct beGetValue.
  • IfType is not Object,throw aType Errrexception.
  • Ifconstructordoes not implement the[Contstruct]internal method,throw aType Errrexception.
  • Return the result of carlling the[Contstruct]internal method onconstruct,providing no argments.
  • The production Member Expression:new Member ExpressionArgments evaluated as follows:
  • Letrefbe the result of evaluating Member Expression.
  • Let construct beGetValue.
  • LetagListbe the result of evaluting Agments、producing an internal list of argment values(11.2.4).
  • IfType is not Object,throw aType Errrexception.
  • Ifconstructordoes not implement the[Contstruct]internal method,throw aType Errrexception.
  • Return the result of carrling the[Contstruct]internal method onconstrutor,providing the listarg Listas the argment values.
  • 11.2.3 Function Calls
    The production CallExpression:Member ExpressionArgements evaluated as follows:
  • Letrefbe the result of evaluating Member Expression.
  • LetfuncbeGetValue.
  • LetagListbe the result of evaluting Agments、producing an internal list of argment values(see 11.2.4).
  • IfType(func)is not Object,throw aType Errrexception.
  • IfIsCallable(func)isfalse,throw aType Errrexception.
  • IfType(ref)isreference,then
  • IfIs PropertyReference(ref)istrue,then
  • LetthisValuebeGetBase.
  • Else,the base off fis anEnvironment Record
  • LetthisValuebe the relt of careling the Implicit ThisValue concrete method off GetBase.
  • Else,Type(ref)is notReference.
  • LetthisValuebeundefined.
  • Return the result of caling the[Call]internal method onfunc,providingthis Valueas thethisvalue and providing the listarg the argListas the argment values.
  • The production CallExpressition:CallExpressionArginentsis evaluated in exactly the same manner、except that the containedCallExpressions evaluated in step 1.
    NOTEThe returned returned will never be of typereferencefuncis a native ECMAScript object.Whether carling a host oject can return a typereferenceis implement.dependent.If value of typereference
    このような大きなロジックを見て、ちょっと怖くなりましたが、見て、半分理解しました.
    Javascriptでは、構造関数にパラメータがないとnewの場合は括弧を省略します.
    //         
    var d = new A;
    var d = new A();
    
    //           ,     :
    var d = new A.B(); //new A.B;
    var d = new A().B(); //new A().B;