Skip to content

JavaScript inheritance from C++ class #60

@ratalaika

Description

@ratalaika

Hello,

Im trying to make an extended Point class that inherits from our C++ Point class, something like this on C++ side:

	GFX.class_<Point>("Point")
		.constructor<double, double>()
		.fun<&Point::x>("x")
		.fun<&Point::y>("y");

And this on JS side:

function Point() { this.initialize.apply(this, arguments); }\
Point.prototype = Object.create(GFX.Point.prototype);
Point.prototype.constructor = Point;
Point.prototype.initialize = function(x, y) { GFX.Point.call(this, x, y); };
Point.emptyPoint = new Point(0, 0);

This seems to flop due to "JS_CFUNC_constructor" been used instead of "JS_CFUNC_constructor_or_func" so it raises a constructor called without "new" issue. If I edit the wrap method and place JS_CFUNC_constructor_or_func that issue is gone and a this

proto = detail::GetPropertyPrototype(ctx, this_value);

Casts a trying to access undefined property issue. If I modify the previous code into

JSValue proto ;
if (JS_IsUndefined(this_value))
{
    proto = JS_GetClassProto(ctx, js_traits<std::shared_ptr<T>>::QJSClassId);
} else
    proto = detail::GetPropertyPrototype(ctx, this_value);

It works and

console.log(Point.emptyPoint instanceof GFX.Point)
console.log(Point.emptyPoint instanceof Point)

Both return TRUE, but when I do
console.log(Point.emptyPoint.x)

I get TypeError: Expected type struct Point, got object with classid 1, Im unsure what to edit at this point to support what we need, any help would be very appreciated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions