为什么String.prototype中的this是指对象types而不是stringtypes?

我试图扩展string来提供自己的散列。 我正在使用Node.jsencryption库。

我像这样扩展string:

String.prototype.hashCode = function() { return getHash(this); }; 

我有一个getHash函数,看起来像这样:

 function getHash(testString) { console.log("type is" + typeof(testString)); var crypto = require('crypto'); var hash = crypto.createHash("sha256"); hash.update(testString); var result = hash.digest('hex'); return result; } 

直接调用该函数可以正常工作,如

 var s = "Hello world"; console.log(getHash(s)); 

但是当我尝试:

 var s = "ABCDE"; console.log(s.hashCode()); 

该方法调用失败。 在调用crypto.hash.update时, crypto.hash.update String.prototype.hashCode中的这个对象被标识为一个对象,但是期望一个string。 我认为this里面的String.prototype本身是string,但由于某种原因,它看起来像getHash()的对象。 我该如何解决?

this不能是严格模式之外的原始types,所以它变成了一个String 包装types ,它根本就不像原始string(特别是就typeof和equal而言 – 既严格又松散)。 你可以施放它:

 String.prototype.hashCode = function () { return getHash( '' + this); }; 

其中'' +用于将任何值转换为基本string。 ( String(this)也可以,如果你觉得它更清晰。)

你也可以进入严格的模式, 只要有意义

 String.prototype.hashCode = function () { 'use strict'; return getHash(this); }; 

当你调用一个原始types的variables的方法时,就会发生所谓的自动装箱 。 该过程将原始值包装到相应的对象中,例如'asdf'new String('asdf') 。 由于技术原始值不具有方法属性 ,因此它们被托pipe在对象原型中。 通过自动装箱,你可以调用原始值的方法。 在一个方法中, this总是具有该方法的对象

如果要访问方法中的原始值,可以将其作为parameter passing,或者如您所愿,从中检索原始值。 例如:

 var str = new String('asdf') // String {0: "a", 1: "s", 2: "d", 3: "f", length: 4, formatUnicorn: function, truncate: function, splitOnLast: function, [[PrimitiveValue]]: "asdf"} String(str) // 'asdf' var num = new Number(123) // Number {[[PrimitiveValue]]: 123} Number(num) // 123 var bool = new Boolean(true) // Boolean {[[PrimitiveValue]]: true} Boolean(bool) // true