Package org.mozilla.javascript
Class LambdaConstructor
java.lang.Object
org.mozilla.javascript.ScriptableObject
org.mozilla.javascript.IdScriptableObject
org.mozilla.javascript.BaseFunction
org.mozilla.javascript.LambdaFunction
org.mozilla.javascript.LambdaConstructor
- All Implemented Interfaces:
Serializable
,Callable
,ConstProperties
,Constructable
,DebuggableObject
,Function
,IdFunctionCall
,Scriptable
,SymbolScriptable
This class implements a JavaScript function that may be used as a constructor by delegating to an
interface that can be easily implemented as a lambda. The LambdaFunction class may be used to add
functions to the prototype that are also implemented as lambdas.
In micro benchmarks (as of 2021) using this class to implement a built-in class is about 15% more efficient than using IdScriptableObject, and about 25% faster than using reflection via the ScriptableObject.defineClass() family of methods. Furthermore, it results in code that more directly maps to JavaScript idioms than either methods, it is much easier to implement than IdScriptableObject, and the lambda pattern makes it easier to maintain state in various ways that don't always map directly to the existing concepts.
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from class org.mozilla.javascript.ScriptableObject
ScriptableObject.KeyComparator
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
By default, the constructor may be invoked either waystatic final int
If this flag is set, the constructor may be invoked as an ordinary functionstatic final int
If this flag is set, the constructor may be invoked using "new"protected final Constructable
Fields inherited from class org.mozilla.javascript.LambdaFunction
target
Fields inherited from class org.mozilla.javascript.BaseFunction
Id_arguments, Id_arity, Id_length, Id_name, Id_prototype, MAX_INSTANCE_ID
Fields inherited from class org.mozilla.javascript.ScriptableObject
CONST, DONTENUM, EMPTY, PERMANENT, READONLY, UNINITIALIZED_CONST
Fields inherited from interface org.mozilla.javascript.Scriptable
NOT_FOUND
-
Constructor Summary
ConstructorDescriptionLambdaConstructor
(Scriptable scope, String name, int length, int flags, Constructable target) Create a new function that may be used as a constructor.LambdaConstructor
(Scriptable scope, String name, int length, Callable target, Constructable targetConstructor) Create a new function that may be used as a constructor.LambdaConstructor
(Scriptable scope, String name, int length, Constructable target) Create a new function that may be used as a constructor. -
Method Summary
Modifier and TypeMethodDescriptioncall
(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) Should be overridden.construct
(Context cx, Scriptable scope, Object[] args) Call the function as a constructor.static <T> T
convertThisObject
(Scriptable thisObj, Class<T> targetClass) A convenience method to convert JavaScript's "this" object into a target class and throw a TypeError if it does not match.void
defineConstructorMethod
(Scriptable scope, String name, int length, Callable target, int attributes) Define a function property directly on the constructor that is implemented under the covers by a LambdaFunction.void
defineConstructorMethod
(Scriptable scope, String name, int length, Callable target, int attributes, int propertyAttributes) Define a function property directly on the constructor that is implemented under the covers by a LambdaFunction, and override the properties of its "name", "length", and "arity" properties.void
defineConstructorMethod
(Scriptable scope, Symbol key, String name, int length, Callable target, int attributes) Define a function property directly on the constructor that is implemented under the covers by a LambdaFunction.void
definePrototypeMethod
(Scriptable scope, String name, int length, Callable target) Define a function property on the prototype of the constructor using a LambdaFunction under the covers.void
definePrototypeMethod
(Scriptable scope, String name, int length, Callable target, int attributes, int propertyAttributes) Define a function property on the prototype of the constructor using a LambdaFunction under the covers.void
definePrototypeMethod
(Scriptable scope, SymbolKey name, int length, Callable target, int attributes, int propertyAttributes) Define a function property on the prototype of the constructor using a LambdaFunction under the covers.void
definePrototypeProperty
(String name, Object value, int attributes) Define a property that may be of any type on the prototype of this constructor.void
definePrototypeProperty
(Context cx, String name, Function<Scriptable, Object> getter, int attributes) Define a property on the prototype using a function.void
definePrototypeProperty
(Context cx, String name, Function<Scriptable, Object> getter, BiConsumer<Scriptable, Object> setter, int attributes) Define a property on the prototype using functions for getter and setter.void
definePrototypeProperty
(Symbol key, Object value, int attributes) Methods inherited from class org.mozilla.javascript.LambdaFunction
getArity, getFunctionName, getLength
Methods inherited from class org.mozilla.javascript.BaseFunction
createObject, execIdCall, fillConstructorProperties, findInstanceIdInfo, findPrototypeId, getClassName, getClassPrototype, getInstanceIdName, getInstanceIdValue, getMaxInstanceId, getPrototypeProperty, getTypeOf, hasDefaultParameters, hasInstance, hasPrototypeProperty, initPrototypeId, isGeneratorFunction, setImmunePrototypeProperty, setInstanceIdAttributes, setInstanceIdValue, setPrototypeProperty, setPrototypePropertyAttributes, setStandardPropertyAttributes, setupDefaultPrototype
Methods inherited from class org.mozilla.javascript.IdScriptableObject
activatePrototypeMap, addIdFunctionProperty, defaultGet, defaultHas, defaultPut, defineOwnProperty, delete, delete, ensureType, ensureType, exportAsJSClass, findInstanceIdInfo, findPrototypeId, get, get, getAttributes, getAttributes, getOwnPropertyDescriptor, has, has, hasPrototypeMap, initPrototypeConstructor, initPrototypeMethod, initPrototypeMethod, initPrototypeMethod, initPrototypeValue, initPrototypeValue, instanceIdInfo, put, put, setAttributes
Methods inherited from class org.mozilla.javascript.ScriptableObject
applyDescriptorToAttributeBitset, associateValue, avoidObjectDetection, buildDataDescriptor, callMethod, callMethod, checkPropertyChange, checkPropertyDefinition, defineClass, defineClass, defineClass, defineConst, defineConstProperty, defineFunctionProperties, defineOwnProperties, defineOwnProperty, defineProperty, defineProperty, defineProperty, defineProperty, defineProperty, defineProperty, defineProperty, defineProperty, delete, deleteProperty, deleteProperty, ensureScriptable, ensureScriptableObject, ensureSymbolScriptable, equivalentValues, get, get, getAllIds, getArrayPrototype, getAssociatedValue, getAttributes, getAttributes, getAttributes, getClassPrototype, getDefaultValue, getDefaultValue, getExternalArrayData, getExternalArrayLength, getFunctionPrototype, getGeneratorFunctionPrototype, getGetterOrSetter, getGetterOrSetter, getIds, getObjectPrototype, getParentScope, getProperty, getProperty, getProperty, getPropertyIds, getPrototype, getTopLevelScope, getTopScopeValue, getTypedProperty, getTypedProperty, has, hasProperty, hasProperty, hasProperty, isAccessorDescriptor, isConst, isDataDescriptor, isEmpty, isExtensible, isFalse, isGenericDescriptor, isGetterOrSetter, isSealed, isTrue, preventExtensions, put, putConst, putConstProperty, putProperty, putProperty, putProperty, querySlot, redefineProperty, sameValue, sealObject, setAttributes, setAttributes, setAttributes, setAttributes, setCommonDescriptorProperties, setExternalArrayData, setGetterOrSetter, setParentScope, setPrototype, size
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.mozilla.javascript.Scriptable
delete, delete, get, get, getDefaultValue, getIds, getParentScope, getPrototype, has, has, put, put, setParentScope, setPrototype
-
Field Details
-
CONSTRUCTOR_FUNCTION
public static final int CONSTRUCTOR_FUNCTIONIf this flag is set, the constructor may be invoked as an ordinary function- See Also:
-
CONSTRUCTOR_NEW
public static final int CONSTRUCTOR_NEWIf this flag is set, the constructor may be invoked using "new"- See Also:
-
CONSTRUCTOR_DEFAULT
public static final int CONSTRUCTOR_DEFAULTBy default, the constructor may be invoked either way- See Also:
-
targetConstructor
-
-
Constructor Details
-
LambdaConstructor
Create a new function that may be used as a constructor. The new object will have the Function prototype and no parent. The caller is responsible for binding this object to the appropriate scope. The new constructor function can be invoked using "new" or by calling it directly, and in either case will result in a new object being returned and wired to the correct prototype and scope.- Parameters:
scope
- scope of the calling contextname
- name of the functionlength
- the arity of the functiontarget
- an object that implements the function in Java. Since Constructable is a single-function interface this will typically be implemented as a lambda.
-
LambdaConstructor
public LambdaConstructor(Scriptable scope, String name, int length, int flags, Constructable target) Create a new function that may be used as a constructor. The new object will have the Function prototype and no parent. The caller is responsible for binding this object to the appropriate scope. The "flags" argument controls whether the function may be invoked using "new," via a direct call, or both. If allowed by the flags, then the constructor will have the same effect either way. If not allowed by the flags, then a TypeError will be thrown.- Parameters:
scope
- scope of the calling contextname
- name of the functionlength
- the arity of the functionflags
- which may be a combination of CONSTRUCTOR_NEW and CONSTRUCTOR_FUNCTIONtarget
- an object that implements the function in Java. Since Constructable is a single-function interface this will typically be implemented as a lambda.
-
LambdaConstructor
public LambdaConstructor(Scriptable scope, String name, int length, Callable target, Constructable targetConstructor) Create a new function that may be used as a constructor. The new object will have the Function prototype and no parent. The caller is responsible for binding this object to the appropriate scope. The new constructor function will have different behavior depending on whether it is invoked via "new" or via a direct call. In the case of "new", a new object with a prototype and scope chain be returned, but in the case of a direct call, the user must implement whatever they need. This is typically used in the case of functions like the native Date constructor, which has totally different behavior depending on how it's invoked.- Parameters:
scope
- scope of the calling contextname
- name of the functionlength
- the arity of the functiontarget
- an object that implements the function in Java. Since Constructable is a single-function interface this will typically be implemented as a lambda.
-
-
Method Details
-
call
Description copied from class:BaseFunction
Should be overridden.- Specified by:
call
in interfaceCallable
- Specified by:
call
in interfaceFunction
- Overrides:
call
in classLambdaFunction
- Parameters:
cx
- the current Context for this threadscope
- the scope to execute the function relative to. This is set to the value returned by getParentScope() except when the function is called from a closure.thisObj
- the JavaScriptthis
objectargs
- the array of arguments- Returns:
- the result of the call
-
construct
Description copied from interface:Function
Call the function as a constructor.This method is invoked by the runtime in order to satisfy a use of the JavaScript
new
operator. This method is expected to create a new object and return it.- Specified by:
construct
in interfaceConstructable
- Specified by:
construct
in interfaceFunction
- Overrides:
construct
in classLambdaFunction
- Parameters:
cx
- the current Context for this threadscope
- an enclosing scope of the caller except when the function is called from a closure.args
- the array of arguments- Returns:
- the allocated object
-
definePrototypeMethod
Define a function property on the prototype of the constructor using a LambdaFunction under the covers. -
definePrototypeMethod
public void definePrototypeMethod(Scriptable scope, String name, int length, Callable target, int attributes, int propertyAttributes) Define a function property on the prototype of the constructor using a LambdaFunction under the covers. -
definePrototypeMethod
public void definePrototypeMethod(Scriptable scope, SymbolKey name, int length, Callable target, int attributes, int propertyAttributes) Define a function property on the prototype of the constructor using a LambdaFunction under the covers. -
definePrototypeProperty
Define a property that may be of any type on the prototype of this constructor. -
definePrototypeProperty
-
definePrototypeProperty
public void definePrototypeProperty(Context cx, String name, Function<Scriptable, Object> getter, int attributes) Define a property on the prototype using a function. The function will be wired to a JavaScript function, so the resulting property will look just like one that was defined using "Object.defineOwnProperty" with a property descriptor. -
definePrototypeProperty
public void definePrototypeProperty(Context cx, String name, Function<Scriptable, Object> getter, BiConsumer<Scriptable, Object> setter, int attributes) Define a property on the prototype using functions for getter and setter. The function will be wired to a JavaScript function, so the resulting property will look just like one that was defined using "Object.defineOwnProperty" with a property descriptor. -
defineConstructorMethod
public void defineConstructorMethod(Scriptable scope, String name, int length, Callable target, int attributes) Define a function property directly on the constructor that is implemented under the covers by a LambdaFunction.- Parameters:
name
- the key to use to look up the new function property, and also the value to return for the "name" property of the Function objectlength
- the value to return for the "length" property of the Function objecttarget
- the target to call when the method is invokedattributes
- the attributes to set on the new property
-
defineConstructorMethod
public void defineConstructorMethod(Scriptable scope, Symbol key, String name, int length, Callable target, int attributes) Define a function property directly on the constructor that is implemented under the covers by a LambdaFunction.- Parameters:
key
- the Symbol to use to look up the propertyname
- the value to return for the "name" property of the Function objectlength
- the value to return for the "length" property of the Function objecttarget
- the target to call when the method is invokedattributes
- the attributes to set on the new property
-
defineConstructorMethod
public void defineConstructorMethod(Scriptable scope, String name, int length, Callable target, int attributes, int propertyAttributes) Define a function property directly on the constructor that is implemented under the covers by a LambdaFunction, and override the properties of its "name", "length", and "arity" properties. -
convertThisObject
A convenience method to convert JavaScript's "this" object into a target class and throw a TypeError if it does not match. This is useful for implementing lambda functions, as "this" in JavaScript doesn't necessarily map to an instance of the class.
-