2016-05-24 6 views
3

組み込み関数のプロトタイプを違法に置き換えていますか?

Date.prototype = { foo : 1 }; 
Date.prototype.foo // => null 

これは、組み込み関数のプロトタイプを交換して、単純に発行されたエラーなしで無視されます、まだ私はそれを言及する任意の記事、書籍、またはブログ記事を見つけることができなかったことを奇妙です。

+1

これを行うのは避けてください。違反はありません。組み込みオブジェクトのプロトタイプを変更することは、いくつのポリフィルが機能するかです。 –

+2

「Date.prototype」を再割り当てすることはできません:http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype参照するオブジェクトを変更することはできますが、 – 1983

答えて

5

いいえ、それは違法ではありません。これは一般に自分で定義した関数で行われます。

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."); 
 
}

+0

はい、プロトタイプは組み込みのjsオブジェクトでフリーズ(つまり読み取り専用)されています。あなたは、ブラウザのインス​​ペクタを使ってこれをチェックすることができます。(firefoxでは)プロパティの横に南京錠があるかどうかを確認します。 – tanenbring

+0

@tanenbring:ああ、私は今それを手に入れます。今朝読んでいるときに、どのように私は南京錠の事を忘れましたか? –

1

ロシアンルーレットのようです。違法ですか?いいえ、あなたは自分を撃つでしょうか?多分。

javascriptのほとんどは、組み込み関数を含むキーと値で構成されており、警告やエラーを出さずに再割り当てできます。意図しない副作用が発生する可能性がありますが、コード内にない場合は、使用しているライブラリの中にあります。

+0

さて、OPの例( 'Date.prototype')は、それが読み取り専用なので準拠ブラウザでは再割り当てできません... –

+0

事実、これのようにjavascriptで許されるいくつかのことがあります。例えば、あなたは 'undefined'を再定義することができます – element11

+0

@ element11あなたは*未定義を再定義することができます – andlrc

0

JavaScript内のオブジェクトのすべてのプロパティは、記述子を定義しています。それはwritable,enumerable,configurableです。プロパティprototypeDateオブジェクトは書き込み可能ではないため、その値を変更することはできません。

あなたはDateprototypeを実行することにより、非書き込み可能であることを自分自身を納得させることができます。

Object.getOwnPropertyDescriptor(Date, 'prototype') 

これはfalseからwritableセットを持つオブジェクトを返します。

関連する問題