The code sample uses allowLoad as the default value.

But, I do think that John's point is important. Putting mutable
objects on the prototype chain is a foot gun. I don't believe in a
linter being the right answer to this problem. The people that run
into this problem are most likely not going to use a linter. This is
why, if we ever agree on class syntax we might want to consider being
opinionated and prevent such usage.

On Tue, Mar 20, 2012 at 17:19, John J Barton
<[email protected]> wrote:
> On Tue, Mar 20, 2012 at 4:34 PM, Allen Wirfs-Brock
> <[email protected]> wrote:
>>
>> On Mar 20, 2012, at 3:57 PM, John J Barton wrote:
>>
>>> On Tue, Mar 20, 2012 at 2:53 PM, Allen Wirfs-Brock
>>> <[email protected]> wrote:
>>>>
>>>> On Mar 20, 2012, at 2:10 PM, John J Barton wrote:
>>>>
>> ...
>>>>
>>>> In ES.next, based upon current proposals, the equivalent can be directly
>>>> expressed  using <| without any additional function calls:
>>>>
>>>>  LoadCodeUnit.prototype = CodeUnit.prototype <| {
>>>>    allowLoad: true,
>>>>
>>>>    get moduleSymbol() {
>>>>      return this.project.getModuleForUrl(this.url)
>>>>    },
>>>>
>>>>    ...
>>>>
>>>> In other words, <| is the operator forms of the function you are requesting
>>>> for the object literal use case.
>>>
>>> I agree that the <| would be a good match to the use shown in the Traceur 
>>> code.
>>>
>>> However, the example shows a significant pitfall waiting for the
>>> unsuspecting: data properties on the prototype. The allowLoad
>>> properties does appear to be intended as a 'static' or class value. In
>>> projects that never use object literals for data properties, then this
>>> ok. But many devs will use object literals for both functions and
>>> data. Soon or later we get burnt.
>>
>> Whether such a data property is good or bad, really depends upon the context.
>
> Of course, but the design question is: Are the bad cases really bad
> and the good cases rare with simple alternatives? I say yes.
>
>> Maybe allowLoad:true is simply a default that is over-ridable on a per 
>> instance basis.  In that case, what is wrong with putting it on the 
>> prototype?  Would you be happier if it was defined as:
>>  get allowLoad() {return true}
>> ?
>
> That would be ok or setting the value in the constructor or
>  LoadCodeUnit.prototype.allowLoad = true;
> Lots of good alternatives rather than playing with confusion and fire.
>
>>
>> If that is the same it makes it harder to over-ride for individual instances 
>> because they need to do a Object.defineProperty to install the over-ride 
>> rather than a simple assignment.
>
> Even this is ok by me. Make simple things simple; its ok if hard
> things are hard.
>
>>
>>>
>>> I suppose the <| operator has the advantage that linters can probably
>>> report data properties in the RHS at edit time.  Making this a compile
>>> error should be considered.
>>
>> But there are plenty of other uses of <| in conjunction with object literal 
>> data properties.
>>
>> For example, you can use <| as an alternative to the new operator.  Assume 
>> that you have the definition I quoted from Tracer then to create a 
>> LoadCodeUnit instance you might say:
>>
>>    let aCU = Load.CodeUnit <| {allowLoad: false, loader: myLoader, url: 
>> "foo.js", state: NOT_STARTED};
>>
>> to create one that doesn't allow loading.
>>
>>
>> As another example, you can use prototype inheritance to buildup data 
>> records with shared parts.  For example:
>>
>> let wb = {lastName: "Wirfs-Brock"};
>> let wbOR = wb <| {state: "Oregon"};
>> let allenwb = wbOR <| {firstName: "Allen"};
>> let rjw = wbOR <| {firstName: "Rebecca"};
>
> All cool examples.
>
>>
>> If you play nanny based upon only one usage pattern you preclude other uses.
>
> Sure but this very point is one that separates <| from 'class'. That
> is, Java et al preclude virtual data.
>
>> It's probably better to make such rules part of a project specific linter.
>
> Or perhaps the check can be on the assignment to .prototype,  the
> argument to Object.create(), or the RHS of <|.
>
> jjb
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss



-- 
erik
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to