public class LambdaConstructor extends LambdaFunction
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.
ScriptableObject.KeyComparator
Modifier and Type | Field and Description |
---|---|
static int |
CONSTRUCTOR_DEFAULT
By default, the constructor may be invoked either way
|
static int |
CONSTRUCTOR_FUNCTION
If this flag is set, the constructor may be invoked as an ordinary function
|
static int |
CONSTRUCTOR_NEW
If this flag is set, the constructor may be invoked using "new"
|
CONST, DONTENUM, EMPTY, PERMANENT, READONLY, UNINITIALIZED_CONST
NOT_FOUND
Constructor and Description |
---|
LambdaConstructor(Scriptable scope,
java.lang.String name,
int length,
Constructable target)
Create a new function that may be used as a constructor.
|
LambdaConstructor(Scriptable scope,
java.lang.String name,
int length,
int flags,
Constructable target)
Create a new function and control whether it may be invoked using new, as a function, or
both.
|
Modifier and Type | Method and Description |
---|---|
java.lang.Object |
call(Context cx,
Scriptable scope,
Scriptable thisObj,
java.lang.Object[] args)
Should be overridden.
|
Scriptable |
construct(Context cx,
Scriptable scope,
java.lang.Object[] args)
Call the function as a constructor.
|
static <T> T |
convertThisObject(Scriptable thisObj,
java.lang.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,
java.lang.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,
java.lang.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,
java.lang.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,
java.lang.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,
java.lang.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 |
definePrototypeProperty(java.lang.String name,
java.lang.Object value,
int attributes)
Define a property that may be of any type on the prototype of this constructor.
|
void |
definePrototypeProperty(Symbol key,
java.lang.Object value,
int attributes) |
getArity, getFunctionName, getLength
createObject, execIdCall, fillConstructorProperties, findInstanceIdInfo, findPrototypeId, getClassName, getClassPrototype, getInstanceIdName, getInstanceIdValue, getMaxInstanceId, getPrototypeProperty, getTypeOf, hasInstance, hasPrototypeProperty, initPrototypeId, isGeneratorFunction, setImmunePrototypeProperty, setInstanceIdAttributes, setInstanceIdValue, setPrototypeProperty, setPrototypePropertyAttributes, setStandardPropertyAttributes, setupDefaultPrototype
activatePrototypeMap, addIdFunctionProperty, defaultGet, defaultHas, defaultPut, defineOwnProperty, delete, delete, ensureType, exportAsJSClass, findInstanceIdInfo, findPrototypeId, get, get, getAttributes, getAttributes, getOwnPropertyDescriptor, has, has, hasPrototypeMap, initPrototypeConstructor, initPrototypeMethod, initPrototypeMethod, initPrototypeMethod, initPrototypeValue, initPrototypeValue, instanceIdInfo, put, put, setAttributes
applyDescriptorToAttributeBitset, associateValue, avoidObjectDetection, buildDataDescriptor, callMethod, callMethod, checkPropertyChange, checkPropertyDefinition, defineClass, defineClass, defineClass, defineConst, defineConstProperty, defineFunctionProperties, defineOwnProperties, defineOwnProperty, 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
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
delete, delete, get, get, getDefaultValue, getIds, getParentScope, getPrototype, has, has, put, put, setParentScope, setPrototype
public static final int CONSTRUCTOR_FUNCTION
public static final int CONSTRUCTOR_NEW
public static final int CONSTRUCTOR_DEFAULT
public LambdaConstructor(Scriptable scope, java.lang.String name, int length, Constructable target)
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.public LambdaConstructor(Scriptable scope, java.lang.String name, int length, int flags, Constructable target)
public java.lang.Object call(Context cx, Scriptable scope, Scriptable thisObj, java.lang.Object[] args)
BaseFunction
call
in interface Callable
call
in interface Function
call
in class LambdaFunction
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 JavaScript this
objectargs
- the array of argumentspublic Scriptable construct(Context cx, Scriptable scope, java.lang.Object[] args)
Function
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.
construct
in interface Constructable
construct
in interface Function
construct
in class LambdaFunction
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 argumentspublic void definePrototypeMethod(Scriptable scope, java.lang.String name, int length, Callable target)
public void definePrototypeMethod(Scriptable scope, java.lang.String name, int length, Callable target, int attributes, int propertyAttributes)
public void definePrototypeProperty(java.lang.String name, java.lang.Object value, int attributes)
public void definePrototypeProperty(Symbol key, java.lang.Object value, int attributes)
public void defineConstructorMethod(Scriptable scope, java.lang.String name, int length, Callable target, int attributes)
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 propertypublic void defineConstructorMethod(Scriptable scope, Symbol key, java.lang.String name, int length, Callable target, int attributes)
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 propertypublic void defineConstructorMethod(Scriptable scope, java.lang.String name, int length, Callable target, int attributes, int propertyAttributes)
public static <T> T convertThisObject(Scriptable thisObj, java.lang.Class<T> targetClass)