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: 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: 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の場合は括弧を省略します.
この問題に関する知識面では、点演算子、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:new
Member ExpressionArgments evaluated as follows:The production CallExpression:Member ExpressionArgements evaluated as follows:
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;