You can with private properties. Verified this in Chrome's console.
(Chrome is currently shipping private properties by default.)
```js
class A { constructor(arg) { return arg } }
class B extends A {
#tag
static isB(value) {
try {
value.#tag
return true
} catch {
return false
}
}
}
var object = Object.freeze({foo: true})
new B(object)
console.log(B.isB(object)) // logs `true`
```
This may seem very odd, but it's consistent with the concept of
private fields being sugar for weak maps.
-----
Isiah Meadows
[email protected]
www.isiahmeadows.com
On Tue, Apr 23, 2019 at 9:32 AM Michał Wadas <[email protected]> wrote:
>
> You can't do "branding" by properties on frozen objects.
>
> On Tue, 23 Apr 2019, 13:44 Andy Earnshaw, <[email protected]> wrote:
>>
>> This is pretty much what I used it for in a previous job role. We loaded and
>> unloaded various iframes, registering APIs and custom elements inside them,
>> adding the `window` object to a WeakSet so the initialisation only ran once.
>>
>> On Tue, 23 Apr 2019 at 10:26, Andrea Giammarchi
>> <[email protected]> wrote:
>>>
>>> WeakSet can be very useful in general to avoid *any* object to be
>>> visited/setup twice, not just those coming from user-land classes.
>>>
>>> Circular references, mixins, DOM nodes one-off events handling, and so on
>>> and so fort.
>>>
>>> On Mon, Apr 22, 2019 at 8:26 PM #!/JoePea <[email protected]> wrote:
>>>>
>>>> (I edited the broken format of my previous post)
>>>>
>>>> What other use cases are there?
>>>>
>>>> On Mon, Apr 22, 2019 at 11:20 AM #!/JoePea <[email protected]> wrote:
>>>>>
>>>>> > WeakSets are perfect for branding and are how I would expect web
>>>>> > platform class branding to be explained.
>>>>> >
>>>>> > ```js
>>>>> > const foos = new WeakSet();
>>>>> >
>>>>> > class Foo {
>>>>> > constructor() {
>>>>> > foos.add(this);
>>>>> > }
>>>>> >
>>>>> > method() {
>>>>> > if (!foos.has(this)) {
>>>>> > throw new TypeError("Foo.prototype.method called on an
>>>>> > incompatible object!");
>>>>> > }
>>>>> > }
>>>>> > }
>>>>> > ```
>>>>>
>>>>> Just curious, is that effectively the same as what the (current) [private
>>>>> fields proposal](https://github.com/tc39/proposal-class-fields) offers?
>>>>>
>>>>> ```js
>>>>> class Foo {
>>>>> #isFoo = true
>>>>>
>>>>> method() {
>>>>> if (this.#isFoo) {
>>>>> throw new TypeError("Foo.prototype.method called on an incompatible
>>>>> object!");
>>>>> }
>>>>> }
>>>>> }
>>>>> ```
>>>>>
>>>>> - Joe
>>>>
>>>> _______________________________________________
>>>> es-discuss mailing list
>>>> [email protected]
>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>
>>> _______________________________________________
>>> es-discuss mailing list
>>> [email protected]
>>> https://mail.mozilla.org/listinfo/es-discuss
>>
>> _______________________________________________
>> es-discuss mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/es-discuss
>
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss