...
SVY-5532, SVY-5523, SVY-5531, SVY-5527 Improved support for JavaScript prototype inside code
Servoy's Script Editor and Build system now have good support for JavaScript prototyping. This allows creating JavaScript objects using prototyping and having proper code completion and builder markers.
Assignment directly to the prototype
Assigning an object as prototype
Deprecated members
Protected members
@extends for public/protected members that are added through by the constructor
IIFE's for setting up the prototype
Code Block |
---|
/** * @constructor * @param {String} name */ function BaseEntity(name) { /* * Storing name as a protected instance variable * @protected */ this.name = name } var initBaseEntity = (function(){ //Setting the prototype of BaseEntity to an object with a set of methods BaseEntity.prototype = { publicMethod: function(){}, /*@protected*/ protectedMethod: function(){}, /*@deprecated*/ deprecatedMethod: function(){} } //Extending the previously set prototype object with another method BaseEntity.prototype.getName = function(){ return this.name } }()) /** * The @extends tag signals the build system that public & protected members added through super constructor are known to code completion and the build system * * @constructor * @extends {BaseEntity} * @param {String} name * @param {NumberString} type */ function ExtendedEntity(name, type) { //Fail-save for when the ExtendedEntity gets called without the 'new' keyword if (!(this instanceof ExtendedEntity)) { return new ExtendedEntity(name, type) } //Calling the BaseEntity constructor, so that the logic defined in the constructor is invoked BaseEntity.call(this, name) /*@protected*/ this.type = type } var initExtendedEntity = (function(){ /* Setting the prototype of ExtendedEntity to an object that has BaseEntity.prototype as prototype * BaseEntity.prototype is not used directly as prototype for ExtendedEntity, as this would mean that any additions made to * the prototype of ExtendedEntity would actually be made on the prototype of BaseEntity */ ExtendedEntity.prototype = Object.create(BaseEntity.prototype) //Properly set the constructor ExtendedEntity.prototype.constructor = SubConstructorExtendedEntity ExtendedEntity.prototype.getType = function(){ return this.type } }()) function test() { var x = new ExtendedEntity('Servoy', 'company') application.output(x.getName()) //Yields 'Servoy' application.output(x.getType()) //Yields 'company' //These bits of code will result in warnings x.deprecatedMethod x.protectedMethod x.name x.type } |
SVY-5615 Improved build system to handle special JavaScript methods like function.call, function.apply, function.bind and Object.create
For .apply/call/bind, the build system will recognize that the .apply/call/bind method will return the same type as the function on which it is called, for example:
Code Block |
---|
var x = Object.prototype.toString.call(object) //Build system will know that .call will return a String, as it is called on the .toString() method of Object, which returns a String value function test() { var y = Array.prototype.slice.call(arguments) //Build system will know that y is an Array, as .slice() of Array returns an Array } |
For Object.create(object, properties) the build system will know that what Object.create returns has the same type as the value of the object parameter, enhanced with the (optional) properties (See Object.create for more info)
SVY-5827 support function types with rest parameters in typedefs
Code Block |
---|
/** * @typedef {{ * name: String, * handler: function(String, Number|*...) * }} */ var MyType |
SVY-5371 Support returning an instance of itself inside Constructor functions without warnings being generated
This allows building in a fail-save for Constructor function not being called with the new
keyword
Code Block |
---|
/** * @public * @constructor */ function MyConstructor(name) { if (!(this instanceof MyConstructor)) { //constructor is not called with the 'new' keyword return new MyConstructor(name) } //rest of the constructor logic }; |
...