08:59
<Jack Works>
Is it possible to freeze the [[Prototype]] of an ordinary object without wrapping it with Proxy?
10:13
<Ashley Claymore>
Nope. Can only make it non-extensible. Props and prototype all part of the same bag
10:40
<Ashley Claymore>
https://github.com/tc39/proposal-freeze-prototype
10:42
<Ashley Claymore>
https://matrixlogs.bakkot.com/TC39_Delegates/2021-09-20#L1
15:30
<nicolo-ribaudo>
Is there an es5 way of creating a function with length n (where n is known statically when I'm writing the code), and for which IsConstructor returns false?
15:51
<jmdyck>
As far as I can tell, in es5, the only functions that don't have a [[Construct]] internal method are all built-ins. So even without the length constraint, the answer looks like no.
16:11
<nicolo-ribaudo>
Ok thanks, that matches what I expected but I was hoping for secret hacks 😂 I know that I can create functions with length 0 and 1 using getters and setters in object literals, but it does not generalize to 2+ args.
18:19
<ljharb>
those functions are constructors tho, aren't they?
18:24
<nicolo-ribaudo>

Nope:

new (Object.getOwnPropertyDescriptor({ get x() {} }, "x").get) 
// TypeError: Object.getOwnPropertyDescriptor(...).get is not a constructor
18:26
<littledan>
yeah, all concise methods, e.g., new ({x() {}}.x)
18:26
<littledan>
and arrow functions
18:44
<jmdyck>
Are you running that in an ES5 engine?
18:45
<littledan>
I am saying, those things are not constructors, and that code throws. I am using a new engine
18:46
<jmdyck>
and nicolo-ribaudo ?
18:46
<littledan>
oh sorry I missed the "es5" part of the question!
18:47
<jmdyck>
looks like semantics changed between es5 and es6
18:56
<Ashley Claymore>
Does that work in ES5? alt: Using a getter, but re defining length and accessing args via arguments
18:56
<Ashley Claymore>
or is it a valid constructor in es5?
19:02
<nicolo-ribaudo>
No, I only tested it in modern browsers. Thank you!
19:04
<nicolo-ribaudo>
For context, I was trying to figure out how to compile arrow functions to es5 in a 100% spec compliant way (mostly for fun, I'm not going to add this to Babel)
19:05
<nicolo-ribaudo>
sent an image.
I thought that the length was non-configurable, this might work to at least keep the semantics of compiled code valid in modern engines 👀
19:07
<jmdyck>
In ES5, get PropertyName etc involves "the result of creating a new Function object as specified in 13.2", which always sets both [[Call]] and [[Construct]].
19:07
<jmdyck>
In ES6, it involves "FunctionCreate(~Method~, ...)", which leads to FunctionAllocate being called with _functionKind_ = "non-constructor", which causes [[Construct]] to not be set.