0

私はこのコードと、初心者向けの問題を少し持っています:

function findfruit (food){

var fruitvalues = ["apple", "orange", "banana", "mango", "kiwi", "watermelon"];
if (fruitsvalues.indexOf(food) != -1){
    return true;
    }
else {
    return false;
    }
    }


var food = prompt("Write down any food you like");
findfruit(food) // returns always the correct answer, true or false

だからここにあります:これは問題なくうまくいきますが、もしそうなら:

String.prototype.fruit = findfruit;

そして、私は作ろうとします

if (food.fruit != true) {
    alert("your food is not a fruit");
    }
else {
    alert("your food is a fruit");

それは機能せず、常に「false」になります。私の問題は、 を呼び出すと、作成したばかりの文字列変数を使用せずfood.fruitに関数が開始されることだと思いますが、その理由はわかりません。の使用方法についてチュートリアルを読んでいるだけで、間違っていることは何も見つかりません(何かがあると確信していますが)。findfruitfoodprototype

助けていただければ幸いです。これはかなり簡単に違いないことはわかっていますが、ここで見つけたプロトタイプに関する他の質問は役に立ちませんでした。

ありがとう!

4

2 に答える 2

1

1) 書き込みfood.fruitは関数呼び出しではありません。関数自体を返すだけです (これは明らかに true にはなりません)。

2) として関数が呼び出されるオブジェクトにアクセスできますthis。関数に引数として渡されることはありません (これは Python ではありません)。正しい実装は

String.prototype.fruit = function() {
   var fruitvalues = ["apple", "orange", "banana"];
   return (fruitvalues.indexOf(this.toString()) != -1);
}

3) このような関数を組み込み型のプロトタイプに追加することはお勧めできません。魅力的ですが、自問する必要があります:「これは、プログラムのあらゆる場所で必要になるほど十分に汎用的ですか?」。

于 2012-11-01T14:01:01.887 に答える
0

これを単に文字列を参照するために使用すると、実際には関数にスコープが設定されます。this.valueOf は親オブジェクト (文字列) を参照します。

String.prototype.fruit = function () {
var fruitvalues = ["apple", "orange", "banana", "mango", "kiwi", "watermelon"];
if (fruitvalues.indexOf(this.valueOf()) != -1){
    return true;
}
else {
    return false;
}
}

var food = 'apple';

if (food.fruit() != true) {
    console.log("your food is not a fruit");
}
else {
    console.log("your food is a fruit");
}
于 2012-11-01T14:06:19.850 に答える