javascript - 如何使用构造函数中创建的方法来更新同一构造函数中的另一个变量?

标签 javascript oop object methods this

在开始之前,我想对收到的所有帮助/意见表示感谢。

我在 Stoyan Stefanov 的面向对象编程练习中遇到了一个大问题。虽然这可能是一个练习问题,但我认为这个问题可以帮助很多初学者(比如我),尤其是 OOP 方面的程序员。练习位于第 4 章问题 #4。

我将复制并粘贴提示:“假设 String() 构造函数不存在。创建一个构造函数 MyString(),其行为尽可能类似于 String()。不允许使用任何内置的- 在字符串方法或属性中,请记住 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 中引用的字符串)是有效字符串或已被首先转换为有效的字符串...这就是我所有问题发生的地方)。

创建精炼的value变量是在代码底部使用.valueOf()方法完成的。我正在尝试使用此方法并将其值返回到代码块顶部的“var valUpdated”。例如,当我在 .charAt() 方法中使用 valUpdated 变量时,就会出现问题。由于某种原因,当我使用 valUpdated 变量时,它引用一个对象,即使它应该引用一个字符串 i.e. .valueOf() 的返回值是一个字符串,但由于某种原因,typeof valUpdated 变量是一个对象

这可以在“for...in”循环中验证。其中 .charAt() 方法 中的第一个“return char”语句(此 return char 语句仅用于错误跟踪)返回“charAt”而不是引用的数字到字符串字符。这必定意味着 valUpdated 中的值是一个对象,因为“for...in”循环会迭代对象的每个属性但是,如果 var valUpdated 是一个字符串,根据方法 .valueOf() 的返回值,它应该是一个字符串,那么“属性”将是 字符串的索引,而对象将是实际的字符串

最有趣的部分是,如果我使用常规参数“value”(与 MyString 构造函数一起使用的参数),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 可以采用下面代码中定义的函数并在上面定义的地方使用它?

最佳答案

在查看此项目页面后希望对您有所帮助。149 Stefanov, S. (2013)“面向对象的 JavaScript,第二版”的练习 4。英国伯明翰:Packt。

问题:在不使用“String()”或内置方法的情况下,编写一个能够接受新参数并返回字符串的 JavaScript 构造函数。

我相信作者期待这样的解决方案: (隐式强制转换为字符串)

function MyString(str) {
   this.str = str;
    return '' + this.str + '';
}

var s = new MyString('hello');

它通过了练习中的所有测试

> s.length;
"5"
> s.[0];
"h"
> s.toString();
"hello"
> s.valueOf();
"hello"
> s.charAt;
"e"

关于javascript - 如何使用构造函数中创建的方法来更新同一构造函数中的另一个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18678168/

相关文章:

javascript - 分析 API 包括子页面

javascript - 数据表中的 masterCheckbox

javascript - jQuery 自动完成功能不向 AJAX 发送数据

python - 猴子修补时如何调用原始方法?

file - CMake:重用为 lib 构建的目标文件到另一个 lib 目标中

javascript - 将项目添加到数组或替换它(如果它具有相同的 ID)

javascript - 一旦 HTML 在 Angular 4 中完全动态呈现,我如何在 jQuery 中调用函数?

C#:强制编译器在使用 myObj.ToString() 时出错

oop - 在 Golang 中,我应该将哪种类型用于仅方法类型?

javascript - 如何为对象的所有实例调用对象函数