ExtendJSFunctionClass1.lpr 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. { Demo showing how to create a Pascal class descendant from a JS function.
  2. }
  3. program ExtendJSFunctionClass1;
  4. {$mode objfpc}
  5. {$ModeSwitch externalclass}
  6. uses
  7. JS, browserconsole;
  8. type
  9. { TJSPerson - a JS function, which is used like a class
  10. Person is declared in the html }
  11. TJSPerson = class external name 'Person'(TJSFunction)
  12. public
  13. First: string; external name 'first';
  14. Last: string; external name 'last';
  15. Age: nativeint; external name 'age';
  16. constructor New(aFirst, aLast: string; aAge: nativeint);
  17. procedure Run(Value: string); external name 'run';
  18. end;
  19. { TContact - descend a Pascal class from the JS function }
  20. TContact = class(TJSPerson)
  21. public
  22. EMail: string;
  23. constructor Create(aFirst, aLast: string; aAge: nativeint; aEMail: string); reintroduce;
  24. end;
  25. constructor TContact.Create(aFirst, aLast: string; aAge: nativeint;
  26. aEMail: string);
  27. begin
  28. inherited New(aFirst,aLast,aAge);
  29. EMail:=aEMail;
  30. end;
  31. procedure TestContact;
  32. var
  33. aPerson: TJSPerson;
  34. aContact: TContact;
  35. begin
  36. aPerson:=TJSPerson.new('Joe','Smith',23);
  37. writeln('TestContact aPerson.First=',aPerson.First,' Last=',aPerson.Last,' Age=',aPerson.Age);
  38. // the JS instanceof operator works on the JS object (should be true)
  39. writeln('TestContact: aPerson instanceof Person = ',jsInstanceOf(aPerson,TJSPerson));
  40. aPerson.Run('TestContact calling aPerson.run');
  41. aContact:=TContact.Create('Foo','Bar',7,'a@b');
  42. writeln('TestContact: aContact.First=',aContact.First);
  43. writeln('TestContact: aContact.Last=',aContact.Last);
  44. writeln('TestContact: aContact.Age=',aContact.Age);
  45. writeln('TestContact: aContact.EMail=',aContact.EMail);
  46. // the JS instanceof operator works on the Pascal object (should be true)
  47. writeln('TestContact: aContact instanceof Person = ',jsInstanceOf(aPerson,TJSPerson));
  48. aContact.Run('TestContact called aContact.run');
  49. end;
  50. begin
  51. TestContact;
  52. end.