class-field-is-observable-by-proxy.js (1365B)
1 // Copyright (C) 2019 Caio Lima. All rights reserved. 2 // This code is governed by the BSD license found in the LICENSE file. 3 4 /*--- 5 description: Public class fields initialization calls [[DefineOwnProperty]] 6 esid: sec-define-field 7 info: | 8 DefineField(receiver, fieldRecord) 9 ... 10 8. If fieldName is a Private Name, 11 a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue). 12 9. Else, 13 a. Assert: IsPropertyKey(fieldName) is true. 14 b. Perform ? CreateDataPropertyOrThrow(receiver, fieldName, initValue). 15 10. Return. 16 includes: [compareArray.js] 17 features: [class, class-fields-public, Proxy] 18 ---*/ 19 20 let arr = []; 21 let expectedTarget = null; 22 function ProxyBase() { 23 expectedTarget = this; 24 return new Proxy(this, { 25 defineProperty: function (target, key, descriptor) { 26 arr.push(key); 27 arr.push(descriptor.value); 28 arr.push(target); 29 assert.sameValue(descriptor.enumerable, true); 30 assert.sameValue(descriptor.configurable, true); 31 assert.sameValue(descriptor.writable, true); 32 return Reflect.defineProperty(target, key, descriptor); 33 } 34 }); 35 } 36 37 class Test extends ProxyBase { 38 f = 3; 39 g = "Test262"; 40 } 41 42 let t = new Test(); 43 assert.sameValue(t.f, 3); 44 assert.sameValue(t.g, "Test262"); 45 46 assert.compareArray(arr, ["f", 3, expectedTarget, "g", "Test262", expectedTarget]); 47 48 reportCompare(0, 0);