Enriched Descriptors, maybe ES7 ?

Andrea Giammarchi andrea.giammarchi at gmail.com
Sun Mar 9 14:43:39 PDT 2014


last link is [the test file](
https://github.com/WebReflection/define-strict-properties/blob/master/test/define-strict-properties.js)
which better than examples in here describes what happens when the library
is around, how ES5 descriptors can guard properties and methods within
objects or prototypal inheritance.

I hope what is this about is a bit more clear.

Best Regards


On Sun, Mar 9, 2014 at 2:30 PM, Andrea Giammarchi <
andrea.giammarchi at gmail.com> wrote:

> about the first example, I forgot the writable for the num property so
> please read that as if I wrote:
>
> ```javascript
> var o = {};
> Object.defineProperty(o, 'num', {
>   writable: true,
>   value: 0,
>   type: 'number'
> });
> ```
>
> the library makes possible to create a partial shim of StructType in few
> lines of code, using same mechanism to guard types:
> https://github.com/WebReflection/define-strict-properties/blob/master/src/StructType.js#L40
>
> In this case, types are downgraded to 'number' ... and that's just an
> example
>
>
> On Sun, Mar 9, 2014 at 2:25 PM, Andrea Giammarchi <
> andrea.giammarchi at gmail.com> wrote:
>
>> As written before, and explained in the project, I can write descriptors
>> with optional extra properties such as:
>>
>> **type**, describing as string the typeof, as Function the expected
>> instanceof, or as generic object as prototypeOf(expectedType)
>>
>> ```javascript
>>
>> var o = {};
>> Object.defineProperty(o, 'num', {
>>   value: 0,
>>   type: 'number'
>> });
>>
>> o.num = 123; // ok
>>
>> o.num = '123'; // throws an error, '123' is string, not number
>>
>> ```
>>
>> The meaning of type here is the same MS choose for TypeScript but no
>> breaking syntax is necessary plus types can be optionally used to described
>> methods or functions too.
>>
>>
>> ```javascript
>>
>> var o = {};
>> Object.defineProperty(o, 'increment', {
>>   value: function (much) {
>>     this.num += much;
>>     return this;
>>   },
>>   arguments: ['number'], // 1 arg as number
>>   returns: Object // just an instanceof object
>> });
>>
>> o.num = 0;
>> o.increment(1).increment(2);
>> o.num; // 3
>>
>> o.increment('1'); // thorws since the argument is not a typeof number
>>
>> ```
>>
>> The received arguments can have overloads so that:
>>
>> ```javascript
>>
>> var o = {};
>> Object.defineProperty(o, 'increment', {
>>   value: function (much) {
>>     this.num += parseFloat(much);
>>     return this;
>>   },
>>   arguments: [['number'],['string']],
>>   // 1 arg as number or 1 arg as string
>>   returns: Object // just an instanceof object
>> });
>>
>> o.num = 0;
>> o.increment(1).increment(2);
>> o.num; // 3
>>
>> o.increment('1'); // OK
>> o.num; // 4
>>
>> o.increment(new Number(1)); // throws, not typeof number/string
>>
>> ```
>>
>> Either the amount of arguments is wrong or the type won't match ... the
>> signature is guarded during development time.
>>
>> In production, you just do not include upfront the proposed script and
>> everything will work as regular ES5 preserving all behaviors and
>> descriptors ... in few words, I am proposing an alternative to TypeScript
>> that integrates well down to ES5.
>>
>> If engines would like to use types and descriptors provide such info,
>> this could have ideally performance benefits too plus the code will be most
>> likely less "*undefined is not defined*" prone.
>>
>> The library I have there, already provides all I've said behind 64 tests
>> that verify the behavior is guarded and preserved with or without the
>> library upfront.
>>
>> Compatibility with the test link [here](
>> https://github.com/WebReflection/define-strict-properties#compatibility)
>>
>> Best Regards
>>
>>
>>
>>
>> On Sun, Mar 9, 2014 at 2:05 PM, Brendan Eich <brendan at mozilla.com> wrote:
>>
>>> Andrea Giammarchi wrote:
>>>
>>>> Although my idea is more about types
>>>>
>>>
>>> You are starting on the wrong foot there. "Types" mean something in CS.
>>> Best if you start with use-cases instead of abusing the term. What code do
>>> you want to write, and how exactly would it operate?
>>>
>>> /be
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20140309/26aea750/attachment-0001.html>


More information about the es-discuss mailing list