0

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

我在 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中的引用字符串)是有效字符串或已首先转换为有效字符串......这就是我所有问题发生的地方)。

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

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

最有趣的部分是,如果我使用常规参数“value”,该参数与 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

2

在查看此项目页面后希望在此处提供帮助。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"
于 2017-02-18T23:20:02.337 回答
1

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

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

于 2013-09-07T22:24:27.863 回答