尝试在hashCode
以及Object.prototype
和String.prototype
上定义Number.prototype
方法。我正在使用以下方法定义原型方法:
Object.defineProperty(Object.prototype, 'hashCode', {
value:function() {/*code*/},
enumerable:false
});
String.prototype.hashCode = function() {/*code*/};
Number.prototype.hashCode = function() {/*code*/};
当我使用(''
,new String()
,3
,new Number()
)中的任何一个创建数字或字符串,并在实例上调用hashCode
时,始终运行Object.prototype.hashCode
方法,而不是String.prototype.hashCode
或Number.prototype.hashCode
。
怎么了?
答案 0 :(得分:1)
使属性描述符可写:true或在将该属性写入继承它的对象时将继承为不可写。 http://jsfiddle.net/5ox1a0f2 - 斜视
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()

答案 1 :(得分:1)
混合属性定义和属性赋值可能会导致此类问题。
如果您还使用String.prototype
和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"

但是,如果您仅使用属性定义,因为您不想要可枚举性,但不关心可配置性和可写性,则通过赋值定义方法可能更方便,然后重新定义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"