0

始める前に、受け取ったすべてのヘルプ/入力に感謝したいと思います。

Stoyan Stefanov によるオブジェクト指向プログラミングの演習で大きな問題が発生しています。これは演習の問題かもしれませんが、この質問は、特に OOP を使用する多くの初心者プログラマー (私のような) の助けになると思います。演習は、第 4 章の質問 #4 にあります。

プロンプトをコピーして貼り付けます。メソッドまたはプロパティであり、String() が存在しないことを覚えておいてください。"

文字列に対して for-in ループを使用すべきではないことを理解しています。ただし、この場合は演習のためだけに使用しています。これは、著者の Stoyan Stefanov がプロンプトの一部として提案したものでもあります。

ここに私がこれまでに持っているコードがあります。いくつかのメソッドとプロパティを持つ MyString というコンストラクタを作成しました。

function MyString(value)
{
  var valUpdated = this.valueOf(); //problems are occuring here; the value in valUpdated should be a string, not an object 

  this.charAt = function(pos) 
  {
      try
      {
        if(typeof pos !== "number")
        {
          throw new Error("Please input a valid number");
        }
        else
        {
          for (var char in valUpdated)
          {
            return char; //problem is occurring here, when I use the original value parameter and not "valUpdated", the first char returned is 0, as expected, otherwise, its "charAt," referring to a method of the object stored in "valUpdated"
            if(Number(char) === pos) //if using the original parameter value (and not valUpdated), this part of the code works just fine
            {
                return char;
            }
          }
        }
      }
      catch (e)
      {
         return "This error occured " + e;
      }
  };  

  this.findLength = function () 
  {
    var counter = 0;
    for (var char in value)
    {
      counter++;
    } 
    return counter;
  };

  this.length = this.findLength();

  this.valueOf = function()  
  {
    var type = typeof value,
        valueNew = value; //i chose not to update the existing variable value to avoid some concept of oop in javascript that i most likely missed
    if (type === "number" || type === "object" || type === "null"      
        || type === "undefined")
    {
      valueNew = "'" + value + "'"; 
      return valueNew;
    }
    else
    {
      return valueNew;
    }
  };
}

問題はすべて、メソッドを使用しようとしているコンストラクターの最初の行で発生しています。このコンストラクターの.charAt( ) 、 MyString()を使用して値を更新し、それ以降のすべてのメソッドで使用します (この方法で最初に入力された値 (つまり、変数valueで参照される文字列) が有効な文字列であるか、最初に有効な文字列に変換されていることを確認してください...これがすべての問題が発生している場所です)。

洗練された変数の作成は、コードの最後で.valueOf()メソッドを使用して行われます。このメソッドを使用して、その値をコード ブロックの先頭にある「var valUpdated」に戻そうとしています。たとえば、 .charAt()メソッドでvalUpdated変数を使用すると、問題が発生します。何らかの理由で、valUpdated変数を使用すると、文字列を参照する必要があるにもかかわらず、オブジェクトを参照します。つまり、 .valueOf() の戻り値は文字列ですが、何らかの理由で valUpdated 変数の typeof は objectです。

これは、「for...in」ループで確認できます。.charAt() メソッドの最初の "return char" ステートメント(このreturn charステートメントはエラーの追跡にのみ使用されます) は、文字列文字を参照する数字の代わりに "charAt" を返します。これは、「for...in」ループがオブジェクトの各プロパティを反復処理するため、 valUpdatedの値がオブジェクトであることを意味する必要があります。ただし、var valUpdatedが文字列であり、メソッド.valueOf()の戻り値に従う必要がある場合、「プロパティ」は文字列のインデックスになり、オブジェクトは実際の文字列になります。

最も興味深い部分は、MyString コンストラクターで使用されるパラメーターである通常のパラメーター「値」を使用すると、 char 変数が正常に機能し、char の値が参照文字列内の文字を参照する数字になることです。

***更新: このコード ブロック全体を取得すると:

  var valUpdated = this.valueOf(); 

  this.charAt = function(pos) 
  {
      try
      {
        if(typeof pos !== "number")
        {
          throw new Error("Please input a valid number");
        }
        else
        {
          for (var char in valUpdated)
          {
            return char;
            if(Number(char) === pos) 
            {
                return char;
            }
          }
        }
      }
      catch (e)
      {
         return "This error occured " + e;
      }
  };  

...そしてコンストラクターの一番下に移動すると、char 変数は数値を返します。誰かがこれを説明できますか?Javascript は、コード内で以下に定義された関数を取り、それが定義されている場所の上で使用できると思いましたか?

4

2 に答える 2

1

呼び出した valueOf 関数は、定義した関数ではなく、Object の関数です。こちらのリンクObject.valueOfを参照してください。コンストラクターの定義では、このキーワードは、インスタンスを新規作成するときに作成されるオブジェクトを参照するため、this.valueOf = function(){...};このインスタンスでプロパティを作成します。ここに関数がありますが、関数式であるため、次の場所には表示されません。最初の行var valUpdated = this.valueOf();は、たまたますべてのユーザー定義オブジェクトのスーパークラスである Object のメソッドを呼び出しています。

また、OOP について話しているので、javascript プロトタイプ チェーンがどのように機能するかについても読みたいと思うかもしれません。

于 2013-09-07T22:24:27.863 に答える