2016-10-20 10 views
2

通常のオブジェクトが、この方法を用いてクローニングすることができるDateオブジェクトに取り組んでいない:JavaScriptのObject.assignは

a = {x:9}; //sample 
b = Object.assign(Object.create(a),a); 
console.log(a); 
console.log(b); 

しかし、Date型の変数はObject.assignとObject.createで動作していないようです。

a = new Date(); 
b = Object.assign(Object.create(a),a); 
console.log(a); 
console.log(b); 

/* 
Results of printing a, b are not the same: 
a: 
Thu Oct 20 2016 11:17:29 GMT+0700 (SE Asia Standard Time) 
b: 
Date {} 
*/ 

私は

b = new Date(a) 

を使用して別の方法Dateオブジェクトのクローンを作成することができます知っている。しかし、なぜOBJEがありますct.assignとObject.createはDate型で作業していませんか?

+0

あなたは何が起こることを期待していますか?元のDateオブジェクトのどのプロパティをコピーする予定ですか? – Pointy

+0

そのプロパティのすべて – johnlowvale

+2

** ** enumerable *と* own *プロパティのすべてをコピーしています。それは、Dateインスタンスにanyインスタンスがないことだけです。 – Pointy

答えて

4

ソースオブジェクトの列挙自身性質上Object.assign()方法コピー。 Dateインスタンスには実際にそのインスタンスはありません(独自のコードを追加しない場合)。

特に、年、月、日付などの日付のプロパティは、JavaScriptの意味でのプロパティではありません。それらはAPIを介して取得できる値です。それはそれらをプロパティにしません。

+0

hm、JSは面白いですが、Date型のインスタンスがJSコードでアクセスできない "ネイティブ"プロパティを持っているようです – johnlowvale

+1

@johnlowvaleはい、純粋なJavaScriptコードでもこれを行う方法があります。オブジェクトのプロパティはオブジェクトのプロパティとして存在し、[MDNドキュメント](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)からもわかるように実際にはDateインスタンスには何もありません。 – Pointy

+0

[* ECMA-262 *](http://ecma-international.org/ecma-262/7.0/index.html#sec-properties-of-date-instances)を参考にしてください。デフォルトの日付インスタンスには、内部プロパティ(時間値、* getTime *でアクセス可能)が1つあり、独自のプロパティはありません。 – RobG

関連する問題