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

时间:2013-09-07 21:43:49

标签: javascript oop object methods this

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

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

我将复制并粘贴提示符:“想象一下String()构造函数不存在。创建一个尽可能接近String()的构造函数MyString()。不允许使用任何构建函数-in字符串方法或属性,并记住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()更新我将在所有其他方法中使用的值(这样我可以首先检查以确保使用的输入值(即变量中引用的字符串)是有效字符串或已经首先转换为有效的字符串...这就是我所有问题都发生的地方。

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

这可以在“for ... in”循环中验证。其中 .charAt()方法中的第一个“return char”语句(此返回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可以在代码中使用下面定义的函数,并在上面定义它时使用它吗?

2 个答案:

答案 0 :(得分:2)

希望在查看此项目页面后获得帮助.149练习4来自Stefanov,S。(2013)“面向对象的JavaScript,第二版”。英国伯明翰: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"

答案 1 :(得分:1)

您调用的valueOf函数不是您定义的函数,而是Object的函数,请参阅此处链接Object.valueOf。 在构造函数的定义中,这个关键字指的是当你新建一个实例时正在创建的对象,所以this.valueOf = function(){...};将在这个实例上创建一个属性,这里是一个函数,但由于它是一个函数表达式,你赢了在第一行看到它,var valUpdated = this.valueOf();正在调用Object的方法,它恰好是所有用户定义的obejcts的超类。

您可能还想阅读有关javascript原型链如何工作的信息,因为您正在谈论OOP。