v8/test/mjsunit/harmony/private-accessors.js
Shu-yu Guo 5f18a2e6a7 [flags] Remove --harmony-private-methods
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}
2020-11-12 23:21:53 +00:00

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);
}