为什么’;在JavaScript中,将函数添加到'Date'是否与将其添加到'Date.prototype'类似? 原来的问题
我意识到我不是100%确定为什么它会这样,所以我想这将是一个很好的问题 注意:为什么’;在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
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
。