在开始之前,我想感谢收到的所有帮助/意见。
我在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可以在代码中使用下面定义的函数,并在上面定义它时使用它吗?
答案 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。