Pourquoi “this” dans Ssortingng.prototype fait-il référence à un type d’object et non à un type de chaîne?

J’essaie d’étendre la chaîne pour fournir un hachage de lui-même. J’utilise la bibliothèque de chiffrement Node.js.

J’étends la chaîne comme ceci:

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

et j’ai une fonction getHash qui ressemble à ceci:

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

La fonction fonctionne bien quand elle est appelée directement, comme dans

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

mais quand j’essaye:

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

l’appel de méthode échoue. Il semble que this dans Ssortingng.prototype.hashCode soit identifié en tant qu’object lorsque crypto.hash.update est appelé, mais qu’une chaîne est attendue. Je pensais que this intérieur de Ssortingng.prototype serait la chaîne elle-même, mais pour une raison quelconque, cela ressemble à un object de getHash() . Comment puis-je le réparer?

this ne peut s’agir que d’un type primitif en dehors du mode ssortingct , il devient donc un type wrapper Ssortingng , qui ne se comporte pas du tout comme une chaîne (en particulier en ce qui concerne le typeof et l’égalité – à la fois ssortingct et loose-go). Vous pouvez le lancer:

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

'' + est utilisé pour convertir n’importe quelle valeur en chaîne primitive. ( Ssortingng(this) fonctionne aussi, si vous sentez que c’est plus clair.)

Vous pouvez également passer en mode ssortingct, où les choses ont un sens :

 Ssortingng.prototype.hashCode = function () { 'use ssortingct'; return getHash(this); }; 

Lorsque vous appelez une méthode sur une variable de type primitif, la soi-disant boxing automatique a lieu. Ce processus encapsule une valeur primitive dans l’object correspondant, par exemple 'asdf' dans une new Ssortingng('asdf') . Comme les valeurs techniquement primitives n’ont pas de méthodes ni de propriétés , elles sont hébergées dans des prototypes d’object. Avec la boxe automatique, vous pouvez appeler des méthodes sur des valeurs primitives. Et dans une méthode, c’est toujours l’ object qui a cette méthode.

Si vous souhaitez accéder à la valeur primitive d’une méthode, vous pouvez la transmettre sous forme d’argument ou, comme vous le souhaitez, en extraire une valeur primitive. Par exemple:

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