Side navigation
#14227 closed bug (duplicate)
Opened August 06, 2013 06:18PM UTC
Closed August 06, 2013 10:32PM UTC
$.isPlainObject improperly returns true for moment.js in 2.x
Reported by: | dcherman | Owned by: | rwaldron |
---|---|---|---|
Priority: | undecided | Milestone: | None |
Component: | unfiled | Version: | 2.0.3 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
In the 2.x branch, $.isPlainObject() returns true for a moment instance ( http://momentjs.com/ ) where in 1.x it returns false ( which is expected )
Test Case: http://jsfiddle.net/N5UBJ/1/
Attachments (0)
Change History (5)
Changed August 06, 2013 06:38PM UTC by comment:1
owner: | → rwaldron |
---|---|
status: | new → assigned |
Changed August 06, 2013 07:19PM UTC by comment:2
resolution: | → wontfix |
---|---|
status: | assigned → closed |
This isn't a bug in jQuery 2.x, it's a bug in Moment that was allowed by jQuery 1.x. In the moment.js source, where moment.prototype is defined, it's the constructor is being paved over and never restored.
https://github.com/moment/moment/blob/05028e20e526b5f38dde3748833e98d7c8e846e8/moment.js#L1133-L1468
A reduced case:
function C(opts) { this.p = opts && opts.p; } // This is actually _defining_ the value of C.prototype to be a plain object, with a method called "clone" C.prototype = { clone: function() { return new C(this); } };
This can be fixed by restoring the constructor:
function C(opts) { this.p = opts && opts.p; } // This is actually _defining_ the value of C.prototype to be a plain object. C.prototype = { // But restoring constructor also restores the [[Prototype]] chain for all instances of C constructor: C, clone: function() { return new C(this); } };
Notice that even jQuery does this for its own prototype: https://github.com/jquery/jquery/blob/master/src/core.js#L76-L80
For more information, read through: http://bugs.jquery.com/ticket/13571 specifically: http://bugs.jquery.com/ticket/13571#comment:4
Changed August 06, 2013 07:23PM UTC by comment:3
If this is a wontfix, then does that mean we're intentionally allowing a difference in behavior between 1.x and 2.x?
Changed August 06, 2013 10:30PM UTC by comment:4
resolution: | wontfix |
---|---|
status: | closed → reopened |