Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么’;在JavaScript中,将函数添加到'Date'是否与将其添加到'Date.prototype'类似? 原来的问题_Javascript - Fatal编程技术网

为什么’;在JavaScript中,将函数添加到'Date'是否与将其添加到'Date.prototype'类似? 原来的问题

为什么’;在JavaScript中,将函数添加到'Date'是否与将其添加到'Date.prototype'类似? 原来的问题,javascript,Javascript,我意识到我不是100%确定为什么它会这样,所以我想这将是一个很好的问题 注意: Date.bar = function() { return 'called bar'; } Date.prototype.foo = function() { return 'called foo'; } 然后在控制台中,注意以下两行代码: Date.bar(); // 'called bar' (new Date).foo() // 'called foo' 但这两个函数会爆炸,并抱怨未定义不是一个函数: D

我意识到我不是100%确定为什么它会这样,所以我想这将是一个很好的问题

注意:

Date.bar = function() { return 'called bar'; }
Date.prototype.foo = function() { return 'called foo'; }
然后在控制台中,注意以下两行代码:

Date.bar(); // 'called bar'
(new Date).foo() // 'called foo'
但这两个函数会爆炸,并抱怨
未定义
不是一个函数:

Date.foo();
(new Date).bar();
从理论上讲,在Date的原型中添加一个方法不应该使它在被取消Date时可用吗?这里到底发生了什么


我从你的回答和游戏机里得到了什么 基本上,
Date
(即,
window.Date
)不是日期对象。这是一个函数,它不是从
Date.prototype
构建的。(此外,日期对象没有定义
prototype
属性,当然它们仍然有一个prototype链。)

typeof Date; // function
typeof (new Date); // object
Date.prototype.isPrototypeOf(new Date); // true
Date.prototype.isPrototypeOf(Date); // false
(new Date).prototype; // undefined
意识到
Date
不是日期对象或日期对象的原型使这一切对我更有意义。谢谢大家


另外,请注意
Date.prototype
Date.\uuuu proto\uuuu
是不同的!前者在创建新的日期对象时,作为函数运行
Date
时使用。后者与普通原型链相关(是
Date
的原型)。

foo
添加到
Date。原型
影响从调用Date作为构造函数创建的所有对象。这就是为什么当你说
(new Date()).foo()
时,
foo
是可见的,但不是
Date.foo()
——后者不会将Date作为构造函数调用

请记住,当您说
newdate()
时,您会得到一个基于Date的
原型的对象。您将
foo
添加到原型中,因此您将在从
new Date()创建的对象上获得
foo


直接向
Date
添加内容只需将其添加到
Date
函数中即可。这就是为什么
Date.bar()
有效,但
(新日期()).bar()无效的原因
bar
不在原型上,因此从调用日期开始创建的对象作为构造函数不可见

但实际上并不是将
foo
添加到“Date's prototype”中,而是将其添加到
Date.prototype
,它是使用
Date
作为构造函数构造的对象的原型


从技术上讲,由于
Date
是一个函数,您可以通过编写
function.prototype.foo=function(){return'called foo';}
,将
foo
添加到
Date
自己的原型中;但显然这不是您想要的。

Date.prototype.foo=…
通过。这意味着您只能在调用
Date
作为构造函数的对象中看到它–
newdate()


Date.bar=…
设置
Date
对象的
bar
属性,该属性恰好是一个函数(请记住,所有函数都是JavaScript中的对象)。该对象与作为构造函数调用
Date
得到的
Date
实例对象无关。

向对象添加属性(如Date)并不意味着Date实例将继承它。基本原型继承;构造函数的实例继承构造函数原型的属性。基本上,
Date
与其他对象一样是一个对象,但是
。prototype
是特殊的(它用于生成实例)?我也从来没有完全理解过这一点。@nkorth:是的,
Date
是一个与其他对象类似的对象(请参见更新以获得答案)。
原型的特殊之处在于它基本上由构造函数创建的每个对象引用。因此,如果有10000个对象,内存中仍然只有一个函数副本,存储在
原型中。但是,如果您有一个像
function Foo(){this.bar=function(){…}}
这样的构造函数,那么对于使用
new Foo()
创建的每个对象,内存中都会有一个单独的
bar