更换内置函数的原型是非法的吗?

ali*_*ice 3 javascript prototype

Date.prototype = { foo : 1 };
Date.prototype.foo // => null
Run Code Online (Sandbox Code Playgroud)

奇怪的是,替换内置函数的原型只是被忽略而没有发出任何错误,但我找不到任何提及它的文章,书籍或博客文章.

T.J*_*der 5

不,这不违法(因为规范并不妨碍你这样做).它通常用于您自己定义的功能.

它在JavaScript规范定义的函数上被忽略,因为它们的prototype属性是只读的.从规范Date.prototype:

Date.prototype的初始值是内部对象%DatePrototype%(20.3.4).

此属性具有属性{ [[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}.

(我的重点.)

只有在松散模式下才会默默地忽略分配给它; 在严格模式下(我们基本上都应该一直使用它),这是一个错误:

"use strict";
Date.prototype = {};
Run Code Online (Sandbox Code Playgroud)


如果您愿意,可以通过以下方式定义您自己的只读属性,其行为方式相同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.");
}
Run Code Online (Sandbox Code Playgroud)