Date.prototype = { foo : 1 };
Date.prototype.foo // => null
奇怪的是,替换内置函数的原型只是被忽略而没有发出任何错误,但我找不到任何提及它的文章,书籍或博客文章。
答案 0 :(得分:5)
不,这不是非法的(因为规范并没有阻止你这样做)。它通常用于您自己定义的功能。
它忽略了JavaScript规范定义的函数,因为它们的prototype
属性是只读。来自the specification for Date.prototype
:
Date.prototype的初始值是内部对象%DatePrototype%(20.3.4)。
此属性具有{ [[Writable]]:false ,[[Enumerable]]:false,[[Configurable]]:false}。
(我的重点。)
在松散模式下,仅分配静默;在严格模式下(我们基本上都应该一直使用它),这是一个错误:
"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.");
}

答案 1 :(得分:1)
就像俄罗斯轮盘赌一样。非法?不,你会自己开枪吗?也许。
javascript中的所有内容都包含键和值,包括内置函数,可以在不给出任何警告或错误的情况下重新分配。虽然可能会出现意想不到的副作用 - 如果不是在您的代码中,那么在您正在使用的某些库中。
答案 2 :(得分:0)
JavaScript中任何对象的每个属性都定义了描述符:是amey@xps ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt
amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt
real 0m3.084s
user 0m0.012s
sys 0m2.308s
amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1
real 0m2.516s
user 0m0.028s
sys 0m2.204s
,writable
,enumerable
。 configurable
对象的属性prototype
不可写,因此您无法更改其值。
您可以通过运行来说服自己Date
的{{1}}不可写:
prototype
这将返回Date
设置为Object.getOwnPropertyDescriptor(Date, 'prototype')
的对象。