Date.prototype = { foo : 1 };
Date.prototype.foo // => null
これは、組み込み関数のプロトタイプを交換して、単純に発行されたエラーなしで無視されます、まだ私はそれを言及する任意の記事、書籍、またはブログ記事を見つけることができなかったことを奇妙です。
Date.prototype = { foo : 1 };
Date.prototype.foo // => null
これは、組み込み関数のプロトタイプを交換して、単純に発行されたエラーなしで無視されます、まだ私はそれを言及する任意の記事、書籍、またはブログ記事を見つけることができなかったことを奇妙です。
いいえ、それは違法ではありません。これは一般に自分で定義した関数で行われます。
prototype
プロパティがであり、読み取り専用であるため、JavaScript仕様で定義されている関数では無視されます。 the specification for Date.prototype
から:それに割り当て
The initial value of Date.prototype is the intrinsic object %DatePrototype% (20.3.4).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
(私の強調)
のみ黙っは、looseモードでは無視されます。 (私たちはすべて基本的にすべての時間を使用する必要があります)strictモードでは、それは誤りです:
"use strict";
Date.prototype = {};
疑問を超えて少し行く、あなた自身を定義することができます読み取り専用の場合のように、同じように振る舞う性質を、Object.defineProperty
経由:
var obj = {};
Object.defineProperty(obj, "answer", {
value: 42,
writable: false // This is for emphasis, it's actually the default
});
tryLoose();
tryStrict();
function tryLoose() {
console.log("Trying to assign new value in loose mode.");
obj.answer = "It's complicated.";
console.log("After assignment, obj.answer = " + obj.answer);
}
function tryStrict() {
"use strict";
console.log("Trying to assign new value in strict mode.");
obj.answer = "It's complicated.";
console.log("We won't get here.");
}
はい、プロトタイプは組み込みのjsオブジェクトでフリーズ(つまり読み取り専用)されています。あなたは、ブラウザのインスペクタを使ってこれをチェックすることができます。(firefoxでは)プロパティの横に南京錠があるかどうかを確認します。 – tanenbring
@tanenbring:ああ、私は今それを手に入れます。今朝読んでいるときに、どのように私は南京錠の事を忘れましたか? –
ロシアンルーレットのようです。違法ですか?いいえ、あなたは自分を撃つでしょうか?多分。
javascriptのほとんどは、組み込み関数を含むキーと値で構成されており、警告やエラーを出さずに再割り当てできます。意図しない副作用が発生する可能性がありますが、コード内にない場合は、使用しているライブラリの中にあります。
JavaScript内のオブジェクトのすべてのプロパティは、記述子を定義しています。それはwritable
,enumerable
,configurable
です。プロパティprototype
のDate
オブジェクトは書き込み可能ではないため、その値を変更することはできません。
あなたはDate
のprototype
を実行することにより、非書き込み可能であることを自分自身を納得させることができます。
Object.getOwnPropertyDescriptor(Date, 'prototype')
これはfalse
からwritable
セットを持つオブジェクトを返します。
これを行うのは避けてください。違反はありません。組み込みオブジェクトのプロトタイプを変更することは、いくつのポリフィルが機能するかです。 –
「Date.prototype」を再割り当てすることはできません:http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype参照するオブジェクトを変更することはできますが、 – 1983