Javascript 为什么我的代码会抛出错误;原型不存在;?
请求中有字符串,如果字符串中有逗号分隔的值,则需要在数组列表中检查多个单词 在数组列表中,返回true。下面的代码引发了一个错误: 原型不存在 梅因酒店Javascript 为什么我的代码会抛出错误;原型不存在;?,javascript,arrays,typescript,Javascript,Arrays,Typescript,请求中有字符串,如果字符串中有逗号分隔的值,则需要在数组列表中检查多个单词 在数组列表中,返回true。下面的代码引发了一个错误: 原型不存在 梅因酒店 const ContentList = ["check", "string", "in", "the", "array"] private ValidateRequestArgs(str) { let arr = new Array(); arr = ContentList; arr.prot
const ContentList = ["check", "string", "in", "the", "array"]
private ValidateRequestArgs(str) {
let arr = new Array();
arr = ContentList;
arr.prototype.contains = function(str) {
return this.indexOf(str) > -1;
};
}
this.validateRequestArgs("check,string");
回答您的问题,因为您试图在没有原型的数组实例上设置原型,而不是在有原型的数组对象上设置原型 忽略示例中的其他问题,若要为数组提供方法contains(),请在初始化代码中执行此操作
Array.prototype.contains = function(str) {
return this.indexOf(str) > -1;
}
现在,要做我认为你想做的事情(问题不清楚),你需要这样的东西
const contentList = ["check", "string", "in", "the", "array"];
function validateRequestArgs(args) {
args = args.split(',');
for (var i = 0; i < args.length; i++) {
if (!contentList.contains(args[i])) return false; // word not in list
}
return true;
}
validateRequestArgs("check,string") // returns true
validateRequestArgs("not,this") // returns false
const contentList=[“check”、“string”、“in”、“the”、“array”];
函数validateRequestStargs(args){
args=args.split(',');
对于(变量i=0;i
您要解决的问题需要以下功能。但我不确定这是否是您想要的,因为它与您编写的函数无关
private ValidateRequestArgs(str) {
return ContentList.some(w => str.indexOf(',' + w + ',') > -1);
}
虽然实际答案是“因为
arr
是一个实例,而不是对象定义”,但此处的实际外卖消息更为重要,因此请继续阅读
JavaScript是一种原型继承语言,这意味着任何带有原型的东西都可以使用new
实例化,并且这些实例都可以引用单一的、确定的原型。很多实例,但只有一个原型。访问与实际对象函数相关联的原型需要使用。原型
,通过特定实例访问原型需要使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,但任何一个访问器都返回相同的。因此,您不能做的一件事是“向实例的原型添加某些内容”,因为没有“实例”原型,您将修改该类型对象的通用原型。无论您如何获得对它的引用:修改它,修改它。因此,其他一切仍然与相同的原型联系在一起。你刚刚修改的。为了一切
您希望的是,arr
有一个函数.contains()
,因此如果是这样的话,就直接这样做:
arr.contains = function(...) { ...}
arr
仍然是JavaScript对象的核心,您可以根据需要动态添加任意多的属性
但接下来我们要做的是:但不要这样做,因为标准JS已经允许您编写代码,作为一个线性行来完成您想要的任务。实际上,没有理由编写一个函数,然后将其固定到您正在使用的对象实例上
显然,您使用的是现代JS,因此假设性能不是问题,您可以使用现有的标准JS阵列函数:
const ContentList = ["check", "string", "in", "the", "array"]
// let's check some content
let inputFromSomewhere = "check,string,where";
let arr = inputFromSomewhere.split(',');
// if there can be spaces around the commas, then you'll
// need to split on "comma possibly surrounded by spaces":
//
// let arr = inputFromSomewhere.split(/\s*,\s*/);
// check which terms are in the list
let yesno = arr.map(v => ContentList.indexOf(v)>-1);
// yesno is now an array of true/false values
// check whether all terms are in the list:
let allPresent = list.reduce((a,v) => a && v);
// allPresent is a single true/false value
// we can even do this in one step:
allPresent = arr.every(v => ContentList.indexOf(v)>-1);
等等。阵列原型已经有很多函数可以实现这一切,而无需编写原型污染的东西,因此请前往,花10到15分钟阅读提供的函数列表(因为其中有很多函数可能是您不知道的)你为什么要把
contains
方法添加到原型中?@hussain我没有输入来给出完整的答案,但是当你新建
一个对象时,你的标题没有原型属性。原型作为可以更新的类型的一部分存在。所以Array
有一个原型new Array()
具有原型所具有的方法,但不具有您所使用的const
和let
的prototype
属性,因此不需要这些方法。只需与.every()
配合使用,就可以了。在常规编程方面,如果要分配arr
,只需说let arr=ContentList
,不要先分配一些内容,然后立即扔掉。另外,由于newarray()
是一堆蠕虫,因此创建新数组的一般方法是使用JS文本语法,let arr=[]代码>这可能是一个XY问题,但你根本没有真正回答他们的问题。更新了我的答案以回答他们的问题。当现代JS(我们显然使用的是const
和let
)已经附带.every()
和reduce()时,你为什么要编写这些代码
?我不想问OP为什么不使用现代方法,只想回答问题。如果你看一下关于我答案的第一条评论,我会因为做得不够好而被否决(然后我添加了第一段)。那么,我该怎么办?如果我不逐字回答问题,我会投反对票;如果我回答了问题,我会投反对票。我想我很糟糕。至于我的答案是纯JS,这只是一个例子,函数的内容才是重要的“在ES6中,正确的方法是什么?那就不同了。我不明白你的答案。我希望验证函数使用字符串,而你的目的是基于数组。如果你能编写这个。validateRequestStargs(“检查,字符串”)然后你也可以写[“check”,“string”]
;我已经明确地为您添加了拆分步骤,但我可以建议您更新帖子,以解释为什么您有一个带逗号的字符串(因为谁知道呢,也许您实际上所做的工作意味着您可以轻松地将其作为数组交付),我必须专门为函数转换为数组字符串,但是“check”,“string”
这将来自客户端请求,然后您需要一个字符串.split(',')
(“逗号拆分”),或输入.split(/\s*,\s*/)
(“逗号拆分,忽略不计