2015-01-02 10 views
5

私はそれ自身のハッシュを提供するために文字列を拡張しようとしています。私はNode.js暗号ライブラリを使用しています。String.prototype内の 'this'はオブジェクト型であり、文字列型ではないのはなぜですか?

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

と私はこのようになりますgetHash機能を持っています:

私はこのような文字列を拡張

var s = "Hello world"; 
console.log(getHash(s)); 
にように、直接呼び出されたときに機能が正常に動作します

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 = "ABCDE"; 
console.log(s.hashCode()); 

メソッド呼び出しが失敗します。 crypto.hash.updateが呼び出されたときにString.prototype.hashCodethisがオブジェクトとして識別されているように見えますが、文字列が必要です。私はthisの中にString.prototypeがあると思っていましたが、なんらかの理由でgetHash()のオブジェクトのように見えます。どうすれば修正できますか?厳しいとゆるい両方 - - 行くことがあれば特にtypeofと平等など、すべての原始的な文字列(のように動作しませんStringwrapper type、なるよう

答えて

7

thisは、strict modeの外プリミティブ型にすることはできません)。あなたはそれをキャストすることができます:

'' +は原始文字列に任意の値をキャストするために使用される
String.prototype.hashCode = function() { 
    return getHash('' + this); 
};

。 (String(this)あなたはそれが明確だと感じた場合にも、動作します。)

あなたはまた、物事がだけ意味作るstrictモード、に行くことができます:あなたは、プリミティブの変数のメソッドを呼び出すと

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

「use strict」と表示されますが、なぜそれが必要なのかを説明するコメントが残っています。ほとんどの保守担当者はその理由を知りません。 – Marcelo

2

をタイプ、いわゆるオートボクシングが行われます。このプロセスは、プリミティブ値を対応するオブジェクトにラップします。たとえば、'asdf'からnew String('asdf')です。技術的にプリミティブな値は、のメソッドのプロパティを持たないため、オブジェクトプロトタイプでホストされています。オートボクシングでは、プリミティブ値のメソッドを呼び出すことができます。メソッド内では、thisは、そのメソッドを持つオブジェクトです。

メソッドのプリミティブ値にアクセスする場合は、引数として渡すか、必要に応じてプリミティブ値をthisから取得します。例:

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 
関連する問題