Processing of instanceof statements for custom JavaScript types in WebKit

Source: Internet
Author: User
Tags hasproperty

In WebKit, the following struct needs to be defined for self-extended JavaScript types

/*!@struct JSClassDefinition@abstract This structure contains properties and callbacks that define a type of object. All fields other than the version field are optional. Any pointer may be NULL.@field version The version number of this structure. The current version is 0.@field attributes A logically ORed set of JSClassAttributes to give to the class.@field className A null-terminated UTF8 string containing the class's name.@field parentClass A JSClass to set as the class's parent class. Pass NULL use the default object class.@field staticValues A JSStaticValue array containing the class's statically declared value properties. Pass NULL to specify no statically declared value properties. The array must be terminated by a JSStaticValue whose name field is NULL.@field staticFunctions A JSStaticFunction array containing the class's statically declared function properties. Pass NULL to specify no statically declared function properties. The array must be terminated by a JSStaticFunction whose name field is NULL.@field initialize The callback invoked when an object is first created. Use this callback to initialize the object.@field finalize The callback invoked when an object is finalized (prepared for garbage collection). Use this callback to release resources allocated for the object, and perform other cleanup.@field hasProperty The callback invoked when determining whether an object has a property. If this field is NULL, getProperty is called instead. The hasProperty callback enables optimization in cases where only a property's existence needs to be known, not its value, and computing its value is expensive. @field getProperty The callback invoked when getting a property's value.@field setProperty The callback invoked when setting a property's value.@field deleteProperty The callback invoked when deleting a property.@field getPropertyNames The callback invoked when collecting the names of an object's properties.@field callAsFunction The callback invoked when an object is called as a function.@field hasInstance The callback invoked when an object is used as the target of an 'instanceof' expression.@field callAsConstructor The callback invoked when an object is used as a constructor in a 'new' expression.@field convertToType The callback invoked when converting an object to a particular JavaScript type.@discussion The staticValues and staticFunctions arrays are the simplest and most efficient means for vending custom properties. Statically declared properties autmatically service requests like getProperty, setProperty, and getPropertyNames. Property access callbacks are required only to implement unusual properties, like array indexes, whose names are not known at compile-time.If you named your getter function "GetX" and your setter function "SetX", you would declare a JSStaticValue array containing "X" like this:JSStaticValue StaticValueArray[] = {    { "X", GetX, SetX, kJSPropertyAttributeNone },    { 0, 0, 0, 0 }};Standard JavaScript practice calls for storing function objects in prototypes, so they can be shared. The default JSClass created by JSClassCreate follows this idiom, instantiating objects with a shared, automatically generating prototype containing the class's function objects. The kJSClassAttributeNoAutomaticPrototype attribute specifies that a JSClass should not automatically generate such a prototype. The resulting JSClass instantiates objects with the default object prototype, and gives each instance object its own copy of the class's function objects.A NULL callback specifies that the default object callback should substitute, except in the case of hasProperty, where it specifies that getProperty should substitute.*/typedef struct {    int                                 version; /* current (and only) version is 0 */    JSClassAttributes                   attributes;    const char*                         className;    JSClassRef                          parentClass;            const JSStaticValue*                staticValues;    const JSStaticFunction*             staticFunctions;        JSObjectInitializeCallback          initialize;    JSObjectFinalizeCallback            finalize;    JSObjectHasPropertyCallback         hasProperty;    JSObjectGetPropertyCallback         getProperty;    JSObjectSetPropertyCallback         setProperty;    JSObjectDeletePropertyCallback      deleteProperty;    JSObjectGetPropertyNamesCallback    getPropertyNames;    JSObjectCallAsFunctionCallback      callAsFunction;    JSObjectCallAsConstructorCallback   callAsConstructor;    JSObjectHasInstanceCallback         hasInstance;    JSObjectConvertToTypeCallback       convertToType;} JSClassDefinition;

Assume that myobject is an object of the Javascript type customized in C and mounted to the global object. The following code is displayed on the webpage:

myObject instanceof MyObject

If myobject is a common object, it is defined in the following way:

JSObjectRef myObject = JSObjectMake(context, MyObject_class(context), NULL);JSStringRef myObjectIString = JSStringCreateWithUTF8CString("MyObject");JSObjectSetProperty(context, globalObject, myObjectIString, myObject, kJSPropertyAttributeNone, NULL);JSStringRelease(myObjectIString);

The preceding JavaScript statement will call jsobjecthasinstancecallback defined in jsclassdefinition to determine whether it is true. If jsobjecthasinstancecallback is not set, false is directly returned, and WebKit will not judge it by itself.

If myobject is a constructor, it is defined in the following way:

Jsstringref myconstructoristring = jsstringcreatewithuf8cstring ("myobject"); jsobjectref myconstructor = jsobjectmakeconstructor (context, myobject_class (context), callasconstructor ); // The callasconstructor and the callback attribute functions in jsclassdefinition are similar to jsobjectsetproperty (context, globalobject, myconstructoristring, myconstructor, role, null); jsstringrelease (myconstructoristring );

When WebKit encounters an instanceof statement, it automatically determines the class attribute of myobject. If myobject is created using the following statement in Javascript

var myObject = new MyObject();

Or in C, use the following statement to create

JSObjectRef myObject = JSObjectMake(context, MyObject_class(context), NULL);

Is true. (In c, the same result can be obtained through jsvalueisinstanceofconstructor () in the javascriptcore API)

Summary:

  • If the custom JavaScript type has no special constructor, the custom type object is returned normally (created through jsobjectmake ), you do not need to implement the jsobjectcallasconstructorcallback and jsobjecthasinstancecallback attributes in the jsclassdefinition structure. The most convenient way is to mount a custom constructor to a global object.
  • If you want to mount an object of the custom JavaScript type to a global object, and the object also acts as a constructor, implement jsobjectcallasconstructorcallback and callback attributes in the jsclassdefinition structure at the same time (this usually means that the returned result of jsobjectcallasconstructorcallback is not a simple object constructed by custom type and cannot be accurately determined by default ).
Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.