アプリ版:「スタンプのみでお礼する」機能のリリースについて

・Dateオブジェクトを見ているのですが、setTimeメソッドが理解できません

・getTimeメソッドだと、「返り値」を受け取れるのに、
setTimeメソッドでは、なぜ「返り値」を受け取れないのでしょうか?
・メソッド名に「set」「get」が付いているので、てっきりセッターゲッターみたいな物だと思ったのですが…

・直接プロパティ値を書き換えるのでしょうか? 参照みたいに

・マニュアルを見たら、「インスタンスを生成した関数を返します。これはデフォルトでは Date コンストラクタです」と書かれているのですが、これはどういう意味なのでしょうか?
・コンストラクタなのに、プロパティ? インスタンスを生成した関数?

>このプロパティの値は関数そのものの参照であり、関数の名前を含んだ文字列ではないことに注意してください
・関数そのものの参照って何ですか?
・Dateオブジェクトの実体はどこに存在しているのでしょうか?

▽Date - JavaScript | MDN
  https://developer.mozilla.org/ja/docs/JavaScript …

A 回答 (6件)

No.4です。


連続すみません、補足です。

JavaScriptのOOPはprototypeベースなので、

function Date(){}

Date.prototype = {
 getDate: function(){},
 setDate: function(t){}
};

と定義している場合、
var today=new Date();
でインスタンスを生成した場合は、
『function Date(){}』この部分だけのインスタンスが生成されます。

この場合のクラスはコンストラクタだけであり、
コンストラクタ以外のメソッド等は含まれていません(が、呼び出しできる)。


------------
あとセッターゲッターですが、
書き方が全く違うので、何か別の物と勘違いされていると思います。

/* ゲッターを定義 */
Date.prototype.__defineGetter__("currentDate", function() { return this.getDate(); });
/* セッターを定義 */
Date.prototype.__defineSetter__("currentDate", function(d) { this.setDate(d); });

var today=new Date();
today.currentDate = 20; // currentDateを左辺に使用するとsetDate()が呼び出される
var current = today.currentDate; // 右辺に使用するとgetDate()が呼び出される
    • good
    • 0
この回答へのお礼

回答ありがとうございましたー

お礼日時:2013/02/28 21:53

訂正です。

すみません。(にしてもアレですが)

class Date{
 private:
  time_t currentTime;
 public:
  Date(){ time(&currentTime); } /* ※ */
  time_t getDate(){
   return currentTime;
  }
  void setDate(time_t now){
   currentTime = now;
  }
};
    • good
    • 0
この回答へのお礼

回答ありがとうございましたー

お礼日時:2013/02/28 21:53

>・メソッド名に「set」「get」が付いているので、てっきりセッターゲッターみたいな物だと思ったのですが…



セッターなら左辺に書くので、返り値どころか呼び出しも無いですよ。


>・マニュアルを見たら、「インスタンスを生成した関数を返します。これはデフォルトでは Date コンストラクタです」と書かれているのですが、これはどういう意味なのでしょうか?
>・コンストラクタなのに、プロパティ? インスタンスを生成した関数?

単純なOOPです。

DateクラスをC++で書くと、こんな感じでしょうか。(微妙にCが混ざってます)

class Date{
 private:
  time_t currentTime;
 public:
  Date(){ time(&currentTime); } /* ※ */
  double getDate(){
   return currentTime;
   }
  void setDate(now){
   currentTime = now;
  }
}

Date today = new Date();
cout<<today.getDate();
today.setDate(1234567);
cout<<today.getDate();

----------------
(ほぼ同じ物を)JavaScriptで記述。

function Date(){
 var currentTime=123;/*現在時刻を仮定*/
 this.getDate=function(){
  return currentTime;
 };
 this.setDate=function(now){
  currentTime = now;
 };
}

var today=new Date();
document.write(today.getDate());
today.setDate(1234567);
document.write(today.getDate());

---------------------------

C++では※の部分だけがコンストラクタですが、
JavaScriptのコンストラクタは、C++やJavaなどのコンストラクタとは異なり、
クラス全体の事を「コンストラクタ」と呼びます。

本来、JavaScriptにはクラスという概念がありません。
C++などの「クラス」が、JavaScriptでコンストラクタと呼ばれています。
定義している部分(コーディング時)をクラス、呼び出している部分(実行時)をコンストラクタと呼ぶ、と考えてみてください。


>>このプロパティの値は関数そのものの参照であり、関数の名前を含んだ文字列ではないことに注意してください
>・関数そのものの参照って何ですか?

すみません、その言葉はどこに書かれているのでしょうか。
その文章の前後に、その意味が書かれていると思います。


変数に代入できるのは文字列や数値だけでなく、関数も可能ですし、代入した関数を呼び出す事も出来ます。
、、、ということでしょうか。。。?

yesterday = 'Date'; // 'Date'という文字列を代入
yesterday = Date; // Date関数を代入



>・Dateオブジェクトの実体はどこに存在しているのでしょうか?

上記の例でいうと、today変数がDateオブジェクトの実体です。
    • good
    • 0
この回答へのお礼

回答ありがとうございました

>JavaScriptのコンストラクタは、C++やJavaなどのコンストラクタとは異なり、
>クラス全体の事を「コンストラクタ」と呼びます。
>本来、JavaScriptにはクラスという概念がありません。
>C++などの「クラス」が、JavaScriptでコンストラクタと呼ばれています
・初めて知りました
・検索してびっくりしました(こんなに違うとは全く思っていませんでした)

>変数に代入できるのは文字列や数値だけでなく、関数も可能ですし、代入した関数を呼び出す事も出来ます。
>yesterday = 'Date'; // 'Date'という文字列を代入
>yesterday = Date; // Date関数を代入
・この説明、大変分かりやすかったです

お礼日時:2013/02/26 15:14

すみません、よく質問の意味が理解できません



「返り値」とはなんでしょうか?
getTimeやsetTimeはセッターやゲッターではなく関数で
どちらも呼べばUTCミリ秒の返り値を返します

関数そのものの参照とは
一言で言えばprototype、他の言語で言うClassのような仕組みです

例えば d=new Date() としたとき実はdはgetTime等のメソッドを持っていません
__proto__を遡って親のDateがもつメソッドを参照しているのです
メソッドではレシーバー(ここではd)を指すthisを使うことにより対象を見分けています

なぜこんな仕組みなのかというと、1つ1つのオブジェクトに固有のメソッドを割り当てていてはいろんな無駄が大きいからです

こういう仕組みなので例えばthisを明示的に与えてあげれば面白いことがおきます

d1=new Date()
d2=new Date()

d1.getTime.call(d2)
はd1ではなくd2の時間を返すでしょう

d1.getTime と d2.getTime は全く同じ関数を参照していて
その関数ではあくまでthisを使って対象を見分けるからです

もっと問題になりそうな例では

d=new Date()
gt=d.getTime
gt()

これは処理系にもよりますがエラーになります

なぜなら
d.getTime としたならDate.prototype.getTimeはthisがdだとわかりますが
gtはwindow.gtということであり、thisにwindowが入ってしまうからです

これはDOMなど、いろんなところに隠れている危険です
    • good
    • 0
この回答へのお礼

・回答ありがとうございました
・知らないことばかりだったので、勉強になりました

・callメソッド、初めて知りました
・ネットで調べたら、「第一引数にthisとしたいオブジェクトを指定」て書いてあったので、ようやく理解できました

>d1.getTime と d2.getTime は全く同じ関数を参照していて
>その関数ではあくまでthisを使って対象を見分ける
・この説明は分かりやすかったです

>gtはwindow.gtということであり、thisにwindowが入ってしまうからです
>これはDOMなど、いろんなところに隠れている危険
・ここも初め意味が全く分からなかったのですが、ネット検索したら同じような内容が色々なサイトで解説されていたので、ようやく意味が分かりました

・難しい内容だったけど、参考になりましたー

お礼日時:2013/02/26 15:05

> メソッド名に「set」「get」が付いているので、てっきりセッターゲッターみたいな物だと思ったのですが…


セッターって普通返り値いらないよね?

> ・直接プロパティ値を書き換えるのでしょうか? 参照みたいに
メソッドなのですから書き換えるのはそのメソッドを呼び出したときのオブジェクトです。
var d = new Date();
alert(d); //現在時刻
d.setTime(0); //オブジェクトdが保持している時刻を書き換え
alert(d); //1970年1月1日

> ・マニュアルを見たら、「インスタンスを生成した関数を返します。これはデフォルトでは Date コンストラクタです」と書かれているのですが、これはどういう意味なのでしょうか?
それsetTimeの説明じゃないよ、違うところ見てる。

> >このプロパティの値は関数そのものの参照であり、関数の名前を含んだ文字列ではないことに注意してください
> ・関数そのものの参照って何ですか?
> ・Dateオブジェクトの実体はどこに存在しているのでしょうか?
要するに
var d = new Date();
alert(d.constructor===Date); //true: オブジェクトdのプロパティconstructorはDate関数そのもの
ということです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>セッターって普通返り値いらないよね?
・$this -> プロパティ = obj.setTime(d);みたいな感じで、思っていたんですけど、違うんですね

>alert(d.constructor===Date); //true: オブジェクトdのプロパティconstructorはDate関数そのもの
・alert(d.constructor);試したら、本当に関数そのものが表示されて、ちょっとびっくりしました
 function Date() { [native code] }
・関数そのもの、ってプロパティになり得るんですね…

お礼日時:2013/02/21 00:01

gettimeはPCの時間を返します。

よってエラーはありうるのです。

でも。
settimeはtimeを持っている変数に対して行うのでエラーがありえないのです。
A=3+2 にエラーがないのと同じ事になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございましたー

お礼日時:2013/02/21 00:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!