为什么Object原型方法会覆盖JavaScript中的String和Number原型方法?

时间:2016-11-07 19:00:21

标签: javascript inheritance prototype-chain

尝试在hashCode以及Object.prototypeString.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()3new Number())中的任何一个创建数字或字符串,并在实例上调用hashCode时,始终运行Object.prototype.hashCode方法,而不是String.prototype.hashCodeNumber.prototype.hashCode

怎么了?

2 个答案:

答案 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.prototypeNumber.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"