回答編集履歴
5
「Date\.prototype\.getFullYear の仮想コード」を追記
answer
CHANGED
@@ -43,4 +43,24 @@
|
|
43
43
|
|
44
44
|
getter/setter は `Object.create`, `Object.defineProperty` でユーザ定義する事が出来ます。
|
45
45
|
|
46
|
+
### Date.prototype.getFullYear の仮想コード
|
47
|
+
|
48
|
+
```JavaScript
|
49
|
+
function Date (year /* [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] */) {
|
50
|
+
this.timeValue = ...; // 1970/01/01 00:00:00 からのミリ秒を代入する。this.timeValue は内部プロパティ [[DateValue]] の仮想コードで実際には存在しない。内部プロパティ [[DateValue]] は外部から参照出来ない。
|
51
|
+
}
|
52
|
+
|
53
|
+
Date.prototype.valueOf = function valueOf () {
|
54
|
+
return this.timeValue; // 内部プロパティ [[DateValue]] を返す
|
55
|
+
};
|
56
|
+
|
57
|
+
Date.prototype.getFullYear = function getFullYear () {
|
58
|
+
return this.timeValue / hogehoge ...; // 内部プロパティ [[DateValue]] を元に「年」を算出する
|
59
|
+
};
|
60
|
+
```
|
61
|
+
|
62
|
+
### 更新履歴
|
63
|
+
|
64
|
+
- 2016/12/15 08:45 「Date.prototype.getFullYear の仮想コード」を追記
|
65
|
+
|
46
66
|
Re: SugiuraY さん
|
4
プロパティとメソッド\(関数\)
answer
CHANGED
@@ -27,4 +27,20 @@
|
|
27
27
|
|
28
28
|
関数オブジェクトはコールバック関数として利用したり、別の場所へ参照コピーする際に利用できます。
|
29
29
|
|
30
|
+
### プロパティとメソッド(関数)
|
31
|
+
|
32
|
+
メソッド(関数)は関数呼び出し時に処理を実行して返り値を算出します。
|
33
|
+
プロパティは基本的には処理を伴いませんが、**getter/setter の例外**があります。
|
34
|
+
`Array#length` には setter の役割があるため、処理を伴います。
|
35
|
+
|
36
|
+
- [22.1.4.1 length - ECMAScript® 2016 Language Specification](http://www.ecma-international.org/ecma-262/7.0/#sec-properties-of-array-instances-length)
|
37
|
+
|
38
|
+
```JavaScript
|
39
|
+
var a = new Array(1, 2, 3);
|
40
|
+
a.length = 2; // Array#length は要素数が2になるように切り詰める処理を行う
|
41
|
+
console.log(a); // [1, 2]
|
42
|
+
```
|
43
|
+
|
44
|
+
getter/setter は `Object.create`, `Object.defineProperty` でユーザ定義する事が出来ます。
|
45
|
+
|
30
46
|
Re: SugiuraY さん
|
3
関数に対して括弧を付けずに参照
answer
CHANGED
@@ -15,4 +15,16 @@
|
|
15
15
|
括弧を付けずに `new Date("2016/12/14").getFullYear` で参照する為には `new Date()` 呼び出し時に「年」を算出して `getFullYear` プロパティを定義しなければなりません。
|
16
16
|
もしくは `Date.prototype.getFullYear` が getter プロパティとして定義されていなければなりません。
|
17
17
|
|
18
|
+
**(2016/12/14 13:39追記)**
|
19
|
+
|
20
|
+
ちなみに、関数に対して括弧を付けずに参照したら関数オブジェクト自身が返ります。
|
21
|
+
|
22
|
+
```JavaScript
|
23
|
+
var date = new Date("2016/12/14");
|
24
|
+
document.write(date.getFullYear); // function getFullYear() { [native code] }
|
25
|
+
document.write(date.getFullYear()); // 2016
|
26
|
+
```
|
27
|
+
|
28
|
+
関数オブジェクトはコールバック関数として利用したり、別の場所へ参照コピーする際に利用できます。
|
29
|
+
|
18
30
|
Re: SugiuraY さん
|
2
通常の関数呼び出し時には括弧が必須\(強調\)
answer
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
> 2. また上記の1.の結果何らかの理由でインスタンスを生成する場合、特定のプロパティの呼び出しに引数を書かなくても良いとして(ここでいうdat.getFullYear()について、dat.getFullYear("2016/12/14")としなくても良いという意味)末尾の()については、なぜ省略できないのでしょうか?
|
12
12
|
|
13
13
|
`()` を付けるのはそれが関数だからです。
|
14
|
-
原則として関数呼び出し時には括弧が必須です(`new` 演算子で引数を指定しない場合のみ省略可能)。
|
14
|
+
原則として**通常の関数呼び出し時には括弧が必須**です(`new` 演算子で引数を指定しない場合のみ省略可能)。
|
15
15
|
括弧を付けずに `new Date("2016/12/14").getFullYear` で参照する為には `new Date()` 呼び出し時に「年」を算出して `getFullYear` プロパティを定義しなければなりません。
|
16
16
|
もしくは `Date.prototype.getFullYear` が getter プロパティとして定義されていなければなりません。
|
17
17
|
|
1
markdown修正
answer
CHANGED
@@ -1,13 +1,18 @@
|
|
1
|
+
### Date.prototype.getFullYear() が引数を要求しない理由
|
2
|
+
|
1
3
|
> 1. ここで、一点目の質問ですが、dat.getFullYear()について、この()のなかに、"2016/12/14"としてdat.getFullYear("2016/12/14")としてMathオブジェクトのように引数を書かないのは、これはインスタンスを生成しているからなのでしょうか?
|
2
4
|
|
3
5
|
`Date.prototype.getFullYear()` は `this` 値を元に「年」を算出する為、引数を必要としません。
|
4
6
|
|
5
7
|
- [20.3.4.4 Date.prototype.getFullYear() - ECMAScript® 2016 Language Specification](http://www.ecma-international.org/ecma-262/7.0/#sec-date.prototype.getfullyear)
|
6
8
|
|
9
|
+
### Date.prototype.getFullYear() の関数呼び出しで括弧を必要とする理由
|
10
|
+
|
7
11
|
> 2. また上記の1.の結果何らかの理由でインスタンスを生成する場合、特定のプロパティの呼び出しに引数を書かなくても良いとして(ここでいうdat.getFullYear()について、dat.getFullYear("2016/12/14")としなくても良いという意味)末尾の()については、なぜ省略できないのでしょうか?
|
8
12
|
|
9
|
-
`()` を付けるのはそれが関数だからです
|
13
|
+
`()` を付けるのはそれが関数だからです。
|
14
|
+
原則として関数呼び出し時には括弧が必須です(`new` 演算子で引数を指定しない場合のみ省略可能)。
|
10
|
-
|
15
|
+
括弧を付けずに `new Date("2016/12/14").getFullYear` で参照する為には `new Date()` 呼び出し時に「年」を算出して `getFullYear` プロパティを定義しなければなりません。
|
11
16
|
もしくは `Date.prototype.getFullYear` が getter プロパティとして定義されていなければなりません。
|
12
17
|
|
13
18
|
Re: SugiuraY さん
|