为什么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