5f18a2e6a7
It's shipped since M84. Bug: v8:8330 Change-Id: Ia643948c0de83fc9a8faf7307b7fd86a1e117dc1 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2511034 Commit-Queue: Shu-yu Guo <syg@chromium.org> Reviewed-by: Marja Hölttä <marja@chromium.org> Cr-Commit-Position: refs/heads/master@{#71166}
114 lines
2.1 KiB
JavaScript
114 lines
2.1 KiB
JavaScript
// Copyright 2019 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
"use strict";
|
|
|
|
// Complementary private accessors.
|
|
{
|
|
let store = 1;
|
|
class C {
|
|
get #a() { return store; }
|
|
set #a(val) { store = val; }
|
|
incA() { this.#a++; } // CountOperation
|
|
setA(val) { this.#a = val; }
|
|
getA() { return this.#a; }
|
|
}
|
|
|
|
const c = new C;
|
|
assertEquals(store, c.getA());
|
|
assertEquals(1, c.getA());
|
|
c.setA(2);
|
|
assertEquals(store, c.getA());
|
|
assertEquals(2, c.getA());
|
|
c.incA();
|
|
assertEquals(store, c.getA());
|
|
assertEquals(3, c.getA());
|
|
}
|
|
|
|
// Compound assignment.
|
|
{
|
|
let store;
|
|
class A {
|
|
get #a() { return store; }
|
|
set #a(val) { store = val; }
|
|
getA() { return this.#a; }
|
|
constructor(val) {
|
|
({ y: this.#a } = val);
|
|
}
|
|
}
|
|
|
|
const a = new A({y: 'test'});
|
|
assertEquals('test', a.getA());
|
|
}
|
|
|
|
// Accessing super in private accessors.
|
|
{
|
|
class A { foo(val) {} }
|
|
class C extends A {
|
|
set #a(val) { super.foo(val); }
|
|
}
|
|
new C();
|
|
|
|
class D extends A {
|
|
get #a() { return super.foo; }
|
|
}
|
|
new D();
|
|
|
|
class E extends A {
|
|
set #a(val) { super.foo(val); }
|
|
get #a() { return super.foo; }
|
|
}
|
|
new E();
|
|
}
|
|
|
|
// Nested private accessors.
|
|
{
|
|
class C {
|
|
get #a() {
|
|
let storeD = 'd';
|
|
class D {
|
|
// Shadows outer #a
|
|
get #a() { return storeD; }
|
|
getD() { return this.#a; }
|
|
}
|
|
return new D;
|
|
}
|
|
getA() {
|
|
return this.#a;
|
|
}
|
|
}
|
|
assertEquals('d', new C().getA().getD());
|
|
}
|
|
|
|
{
|
|
assertThrows(() => {
|
|
class A {
|
|
[this.#a] = 1;
|
|
get #a() {}
|
|
}
|
|
}, TypeError);
|
|
|
|
assertThrows(() => {
|
|
class A {
|
|
[this.#a] = 1;
|
|
set #a(val) {}
|
|
}
|
|
}, TypeError);
|
|
|
|
assertThrows(() => {
|
|
class A {
|
|
[this.#a] = 1;
|
|
set #a(val) {}
|
|
get #a() {}
|
|
}
|
|
}, TypeError);
|
|
}
|
|
|
|
// Duplicate private accessors.
|
|
// https://tc39.es/proposal-private-methods/#sec-static-semantics-early-errors
|
|
{
|
|
assertThrows('class C { get #a() {} get #a() {} }', SyntaxError);
|
|
assertThrows('class C { set #a(val) {} set #a(val) {} }', SyntaxError);
|
|
}
|