JavaScriptのDateをObject.freeze()する方法はありますか?
質問
によると
MDN
Object.freeze()
ドキュメント
:
は
Object.freeze()
メソッドはオブジェクトをフリーズさせます。 つまり、新しいプロパティが追加されるのを防ぎ、既存のプロパティが削除されるのを防ぎ、既存のプロパティ、またはその列挙性、設定性、書き込み性が変更されるのを防ぎます。要するに、オブジェクトは事実上不変となるのです。このメソッドは、凍結されたオブジェクトを返します。
私は、ある日付でfreezeを呼び出すとその日付の変更を防ぐことができると期待していましたが、それは動作していないようです。 以下は、私が行っていることです (Node.js v5.3.0 を実行しています)。
let d = new Date()
Object.freeze(d)
d.setTime(0)
console.log(d) // Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
への呼び出しを期待したのですが
setTime
への呼び出しが失敗するか、何もしないことを期待します。日付を凍結する方法について何かアイデアがありますか?
どのように解決するのですか?
<ブロッククオートJavaScriptのDateをObject.freeze()する方法はありますか?
ないと思います。あなたが得ることができる
閉じる
を得ることができますが、下の行の下を参照してください。しかし、その前に、なぜ単に
Object.freeze
がうまくいかない理由を見てみましょう。
ある日付でfreezeを呼び出すと、その日付の変更ができなくなると思っていたのですが...。
それは
もし
Date
は内部の時間値を保持するためにオブジェクトプロパティを使用していましたが、そうではありません。それは
[[DateValue]]
内部スロット
の代わりに
内部スロット
はプロパティではありません。
内部スロットは、オブジェクトに関連付けられ、様々なECMAScriptの仕様アルゴリズムによって使用される内部状態に対応します。内部スロットはオブジェクトのプロパティではありません...
つまり、オブジェクトをフリーズさせても、そのオブジェクトの
[[DateValue]]
内部スロットを変異させる能力に影響を与えません。
あなたは
できます
を凍結することができます。
Date
をフリーズさせることができます。あるいは、とにかく効果的にそうすることができます。そのすべてのミューテータ・メソッドをno-op関数(またはエラーを投げる関数)に置き換えて、次に
freeze
とすることができます。しかし
が観測した
によって
zzzzBov
(いいね!)
を行うことを妨げるものではありません。
Date.prototype.setTime.call(d, 0)
(凍結したオブジェクトを回避するための意図的な試み、または使用している複雑なコードの副産物として) を行うことを妨げるものではありません。つまり、それは
閉じる
ですが、葉巻はありません。
以下はその例です(ここではES2015の機能を使用しています、私が見たのは
let
を見たので、これを実行するには最近のブラウザが必要です。しかし、これは ES5 のみの機能でも実行できます)。
"use strict";
let d = new Date();
freezeDate(d);
d.setTime(0);
snippet.log(d);
function nop() {
}
function freezeDate(d) {
allNames(d).forEach(name => {
if (name.startsWith("set") && typeof d[name] === "function") {
d[name] = nop;
}
});
Object.freeze(d);
return d;
}
function allNames(obj) {
var names = Object.create(null); // Or use Map here
var thisObj;
for (thisObj = obj; thisObj; thisObj = Object.getPrototypeOf(thisObj)) {
Object.getOwnPropertyNames(thisObj).forEach(name => {
names[name] = 1;
});
}
return Object.keys(names);
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
I
を考える
のすべてのミューテーターメソッドは
Date
で始まる
set
でなければ、上記を微調整するのは簡単です。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] JavaScriptの日付の書式設定方法
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] JavaScriptでjson-objectのキーを取得する [重複].
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] 変異を伴わないオブジェクトからの値の削除