pas2js/demo/extend_jsclass/ExtendJSFunctionClass1.lpr

65 lines
1.9 KiB
ObjectPascal

{ Demo showing how to create a Pascal class descendant from a JS function.
}
program ExtendJSFunctionClass1;
{$mode objfpc}
{$ModeSwitch externalclass}
uses
JS, browserconsole;
type
{ TJSPerson - a JS function, which is used like a class
Person is declared in the html }
TJSPerson = class external name 'Person'(TJSFunction)
public
First: string; external name 'first';
Last: string; external name 'last';
Age: nativeint; external name 'age';
constructor New(aFirst, aLast: string; aAge: nativeint);
procedure Run(Value: string); external name 'run';
end;
{ TContact - descend a Pascal class from the JS function }
TContact = class(TJSPerson)
public
EMail: string;
constructor Create(aFirst, aLast: string; aAge: nativeint; aEMail: string); reintroduce;
end;
constructor TContact.Create(aFirst, aLast: string; aAge: nativeint;
aEMail: string);
begin
inherited New(aFirst,aLast,aAge);
EMail:=aEMail;
end;
procedure TestContact;
var
aPerson: TJSPerson;
aContact: TContact;
begin
aPerson:=TJSPerson.new('Joe','Smith',23);
writeln('TestContact aPerson.First=',aPerson.First,' Last=',aPerson.Last,' Age=',aPerson.Age);
// the JS instanceof operator works on the JS object (should be true)
writeln('TestContact: aPerson instanceof Person = ',jsInstanceOf(aPerson,TJSPerson));
aPerson.Run('TestContact calling aPerson.run');
aContact:=TContact.Create('Foo','Bar',7,'a@b');
writeln('TestContact: aContact.First=',aContact.First);
writeln('TestContact: aContact.Last=',aContact.Last);
writeln('TestContact: aContact.Age=',aContact.Age);
writeln('TestContact: aContact.EMail=',aContact.EMail);
// the JS instanceof operator works on the Pascal object (should be true)
writeln('TestContact: aContact instanceof Person = ',jsInstanceOf(aPerson,TJSPerson));
aContact.Run('TestContact called aContact.run');
end;
begin
TestContact;
end.