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

时间:2016-05-24 17:21:45

标签: javascript prototype

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

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

3 个答案:

答案 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 writableenumerableconfigurable对象的属性prototype不可写,因此您无法更改其值。

您可以通过运行来说服自己Date的{​​{1}}不可写:

prototype

这将返回Date设置为Object.getOwnPropertyDescriptor(Date, 'prototype') 的对象。