Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的代码会抛出错误;原型不存在;?_Javascript_Arrays_Typescript - Fatal编程技术网

Javascript 为什么我的代码会抛出错误;原型不存在;?

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

请求中有字符串,如果字符串中有逗号分隔的值,则需要在数组列表中检查多个单词 在数组列表中,返回true。下面的代码引发了一个错误:

原型不存在

梅因酒店

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*/)
(“逗号拆分,忽略不计