繁体   English   中英

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

[英]Why would an Object prototype method override String and Number prototype methods in JavaScript?

尝试在Object.prototype以及String.prototypeNumber.prototype上定义hashCode方法。 我正在使用以下方法定义原型方法:

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

怎么了?

将属性描述符设置为可写: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() 

混合属性定义和属性分配可能导致此类问题。

如果您还使用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" 

但是,如果只使用属性定义是因为您不希望可枚举性,而又不关心可配置性或可写性,那么通过赋值定义方法然后重新定义可枚举性可能会更方便:

 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" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM