Brendan Eich wrote:
Russell Leggett wrote:
And would result in copying all of the properties from myMixin into
the object literal.

Including the private-named properties? That would be bad for integrity:
Alice can't give Bob an object-as-capability where the private names
stay private. Bob can extract them via this hypothetical
spread-in-braces and then abuse them (e.g. to brand a counterfeit object
and fool Carol into thinking it was from Alice).

In any decently powerful trait composition system, you have to allow copying private-named properties (if only for class prototypes, but if it is possible for them, people will other abuse it or there should be ability ot do it in more general fashion)>

I do not want spread for objects (it is really too much, I understand, though once I also thought it is a good idea), but I think something that DRYs .{} should be there.

Let me recall one of my suggestions from before (which was tl;dr-ed becuase it was long):

1. add 'f(x,y)' as a possibility into object-initializer (comma delimited) as well as recently-proposed max-min classes (semicolon-delimited*), for example:

  let obj = { a:2, b:4, prop("c", 6), counter() };
  class Foo {
    constructor(x) { this.{ prop("x", x) } }
    counter()
  }

* note: I still see max-min class basically as an object-initializer for .prototype, just with some elements banned and other mapped to slightly different syntax; so this is also just a mapping of sort.

2. In the spirit of * for generators, allow function% definitions (and concise methods) for data-structure (having object-initializer syntax in { body } block**), to be used as delineated above:

  private x;
  function% prop (name, initial) {
    @x: initial,
    get [name] () { return this.@x; },
    set [name] (v) { this.@x = v; }
  }

  private cnt;
  function% counter() {
    inc () { if (!this.@cnt) { this.@cnt = 1; } else { ++this.@cnt; } },
    current () { return this.@cnt || 0; }
  }

** or using the mapping mentioned in * footnote, but then it must be elaborated how it is used for data-properties (and people would ask why they are not usable in classes).
------

Would it be (more) ok to allow such pre-built block be included in objects even if they carry private properties? I somehow think this is inevitable, sooner or later.

This does not allow to copy from any object, only from pieces that were specified as usable for composition.

/be

Herby

P.S.: Of course, if in any level of "call" a property or getter is encountered from within max-min class definition, it should throw an error, this is by no way meant as a way to sneak data-definition into classes which prohibit this in the current state.
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to