Trying to define a hashCode
method on Object.prototype
as well as String.prototype
and Number.prototype
. I'm defining the prototype methods using:
Object.defineProperty(Object.prototype, 'hashCode', {
value:function() {/*code*/},
enumerable:false
});
String.prototype.hashCode = function() {/*code*/};
Number.prototype.hashCode = function() {/*code*/};
When I create a number or string with any of ( ''
, new String()
, 3
, new Number()
), and call hashCode
on the instance, the Object.prototype.hashCode
method always runs instead of String.prototype.hashCode
or Number.prototype.hashCode
.
What's wrong?
Make the property descriptor writable: true or it will be inherited as non-writable when writing that property on objects that inherit it. http://jsfiddle.net/5ox1a0f2 – squint
Object.defineProperty(Object.prototype, 'hashCode', { value:function() {console.log('object')}, enumerable:false, writable:true }); String.prototype.hashCode = function() {console.log('string')}; Number.prototype.hashCode = function() {console.log('number')}; 4..hashCode()
Mixing property definitions and property assignments can lead to this kind of problems.
It works if you also use property definition in String.prototype
and Number.prototype
:
Object.defineProperty(Object.prototype, 'hashCode', { value: function() {console.log('object')}, enumerable: false }); Object.defineProperty(String.prototype, 'hashCode', { value: function() {console.log('string')}, enumerable: false }); Object.defineProperty(Number.prototype, 'hashCode', { value: function() {console.log('number')}, enumerable: false }); (4).hashCode(); // "number" ('').hashCode(); // "string"
However, if you are only using property definitions because you don't want enumerability, but don't care about configurability nor writability, it may be more convenient to define the methods via assignment, and then redefine the enumerability:
Object.prototype.hashCode = function() {console.log('object')}; String.prototype.hashCode = function() {console.log('string')}; Number.prototype.hashCode = function() {console.log('number')}; Object.defineProperty(Object.prototype, 'hashCode', {enumerable: false}); Object.defineProperty(String.prototype, 'hashCode', {enumerable: false}); Object.defineProperty(Number.prototype, 'hashCode', {enumerable: false}); (4).hashCode(); // "number" ('').hashCode(); // "string"
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.