Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Array.prototype.lengthをアクセッサプロパティで再現するのサンプルコードをリファクタリングした #1626

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
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
2 changes: 1 addition & 1 deletion source/basic/class/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,7 @@ class ArrayLike {
}

set length(newLength) {
const currentItemLength = this.items.length;
const currentItemLength = this.length;
// 現在要素数より小さな`newLength`が指定された場合、指定した要素数となるように末尾を削除する
if (newLength < currentItemLength) {
this._items = this.items.slice(0, newLength);
Expand Down
2 changes: 1 addition & 1 deletion source/basic/class/example/ArrayLike.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class ArrayLike {
}

set length(newLength) {
const currentItemLength = this.items.length;
const currentItemLength = this.length;
Copy link
Collaborator

@azu azu Feb 27, 2023

Choose a reason for hiding this comment

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

個人的には下で this.items.slice(0, newLength);this.items を参照してるので、ここでは this.itemslength を見るのが正しいかなーとは思いました
(get length()と get items()の実装が異なる可能性があるのと、一貫性)
また、currentItemLength なので this.length だとItemのlengthだとちょっとわかりにくいというのもあります。

あと、setterの中で同じ名前のgetterを参照するのはなんか無限ループ感があってちょっと怖いというが感覚的に避けたい理由ですかね。

Copy link
Collaborator

@azu azu Feb 27, 2023

Choose a reason for hiding this comment

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

多分一番良いのは、getter/setter内からはgetter/setterを触らないようにするという感じにして、ここでもthis._itemsを常に使うとかなのかなーとはちょっと思いました。

getter/setterそのものが可読性的には微妙なので(見た目で区別ができない)、改善するとしたら一貫性なのかなーとは思いました。

// 現在要素数より小さな`newLength`が指定された場合、指定した要素数となるように末尾を削除する
if (newLength < currentItemLength) {
this._items = this.items.slice(0, newLength);
Expand Down