Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 9 additions & 10 deletions source/basic/class/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,6 @@ MyClass(); // => TypeError: class constructors must be invoked with |new|
```

また、コンストラクタは初期化処理を書く場所であるため、`return`文で値を返すべきではありません。
JavaScriptでは、コンストラクタ関数が任意のオブジェクトを返すことが可能ですが、行うべきではありません。
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この箇所について、完全に同じではありませんが似たようなことが続いて書かれており不自然に感じたため、後半の文を削除しました。

Copy link
Collaborator

@azu azu Feb 18, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

微妙に異なることを言っていて、どちらかという後者の方がストレートな表現な気がします。
前者は、仕様的にできないようにも読めます。コードの対応を考えると後者をベースにしたほうが良い気がしました

また、コンストラクタ関数は`return`文で任意のオブジェクトを返すことが可能ですが、行うべきではありません。
なぜなら、クラスを`new`演算子で呼び出し、その評価結果はクラスのインスタンスを期待するのが一般的であるためです。

なぜなら、コンストラクタは`new`演算子で呼び出し、その評価結果はクラスのインスタンスを期待するのが一般的であるためです。

次のコードのようにコンストラクタで返した値が`new`演算子で呼び出した際の返り値となります。 このような書き方は混乱を生むため避けるべきです。
Expand Down Expand Up @@ -458,8 +457,8 @@ class ArrayLike {

set length(newLength) {
const currentItemLength = this.items.length;
// 現在要素数より小さな`newLength`が指定された場合、指定した要素数となるように末尾を削除する
if (newLength < currentItemLength) {
// 現在要素数より小さな`newLength`が指定された場合、指定した要素数となるように末尾を削除する
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

直下の else if ブロックに合わせ、コメント位置を修正しました。

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これは元の位置にあるのが通常な気がします。
コメントに条件の説明が入ってるので、条件より後に説明があるのは不自然に見えます。

this._items = this.items.slice(0, newLength);
} else if (newLength > currentItemLength) {
// 現在要素数より大きな`newLength`が指定された場合、指定した要素数となるように末尾に空要素を追加する
Expand All @@ -481,7 +480,7 @@ console.log(arrayLike.items.join(", ")); // => "1, 2, , , "

## [ES2022] Publicクラスフィールド {#public-class-fields}

クラスでは、`constructor`メソッドの中でクラスの状態であるインスタンスのプロパティの初期化することを紹介しました
クラスでは、`constructor`メソッドの中でクラスの状態であるインスタンスのプロパティを初期化することを紹介しました
先ほども紹介した`Counter`クラスでは、`constructor`メソッドの中で`count`プロパティの初期値を`0`として定義しています。

```js
Expand Down Expand Up @@ -535,7 +534,7 @@ console.log(counter.count); // => 1
{{book.console}}
<!-- doctest:meta:{ "ECMAScript": "2022" } -->
```js
// 別々のプロパティ名はそれぞれ定義される
// 別々のプロパティ名がそれぞれ定義される
class MyClass {
publicField = 1;
constructor(arg) {
Expand Down Expand Up @@ -637,7 +636,7 @@ console.log(counter.count); // => 1

クラスフィールドでの`this`は、Arrow Functionと組み合わせると強力です。

次のコードでは、`up`メソッドに`this.increment`メソッドを呼び出す関数をArrow Function定義しています
次のコードでは、`up`メソッドを`this.increment`メソッドを呼び出すArrow Functionとして定義しています
Arrow Functionで定義した関数における`this`は、どのような呼び出し方をしても変化しません(「[Arrow Functionでコールバック関数を扱う][]」を参照)。
そのため、`up`メソッドはどのような呼び方をした場合でも`this`がクラスのインスタンスとなるため、確実に`increment`メソッドを呼び出せます。

Expand Down Expand Up @@ -723,7 +722,7 @@ setterは`=`での代入に反応します。そのため、`constructor`の中

## [ES2022] Privateクラスフィールド {#private-class-fields}

クラスフィールド構文で次のように書くと、定義したプロパティはクラスのインスタンス化した後に外からも参照できます
クラスフィールド構文で次のように書くと、定義したプロパティはクラスをインスタンス化した後に外からも参照できます
そのため、Publicクラスフィールドと呼ばれます。

```js
Expand Down Expand Up @@ -920,9 +919,9 @@ console.log(arrayWrapper.length); // => 3

### [ES2022] 静的クラスフィールド {#static-class-fields}

ES2022で追加されたクラスフィールドも、インスタンスではなくクラス自体に定義する静的クラスフィールドが利用できます
ES2022で追加されたクラスフィールドでは、インスタンスではなくクラス自体に定義する静的クラスフィールドも利用できます

静的クラスフィールドはフィールドの前に、`static`をつけるだけです。
静的クラスフィールドは、フィールドの前に`static`をつけるだけです。
静的クラスフィールドで定義したプロパティは、クラス自体のプロパティとして定義されます。
次のコードでは、Public静的クラスフィールドを使って`Colors`クラス自体にプロパティを定義しています。

Expand Down Expand Up @@ -986,7 +985,7 @@ example.instanceMethod();
example.prototypeMethod();
```

しかしこの2つのメソッドの定義方法は、メソッドを定義先となるオブジェクトが実際に異なります
しかしこの2つのメソッドの定義方法は、メソッドの定義先となるオブジェクトが実際は異なります
Copy link
Collaborator

@azu azu Feb 18, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この"実際に"は、強調的な意味合いだと思うので、"実際は"にすると少し不自然な気がしました。(どっちも"実際には"の短縮のように感じるかも)

📝 何に対して 実際は なのかが気になる。
何かを否定する文な気がするけど、否定する対象の文がない。
(同じオブジェクトに定義しているように見えます とかの前提がない)


まず、この2種類のメソッドがそれぞれ別の場所へと定義されていることを見ていきます。
次のコードでは、`ConflictClass`クラスに`method`という同じ名前のメソッドをプロトタイプメソッドとインスタンスに対してそれぞれ定義しています。
Expand Down Expand Up @@ -1395,7 +1394,7 @@ console.log(instance.field); // => "子クラスで定義したフィールド"
Publicクラスフィールドは、このように親クラスで定義したフィールドも子クラスに定義されます。
一方で、Privateクラスフィールドは、このように親クラスで定義したフィールドは子クラスに定義されません。

次のコードでは、親クラスで定義したPrivateクラスフィールドを子クラスから参照してようとしています
次のコードでは、親クラスで定義したPrivateクラスフィールドを子クラスから参照しようとしています
しかし、`#parentField`は参照できずに構文エラーとなることがわかります。

<!-- textlint-disable eslint -->
Expand Down