为什么我的代码抛出错误“原型不存在”?

时间:2018-07-19 15:54:23

标签: javascript arrays typescript

我在请求中包含一个字符串,该字符串可以包含多个单词,如果字符串中的任何逗号分隔值是 在数组列表中返回true。我下面的代码抛出错误:

  

原型不存在

main.ts

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");

3 个答案:

答案 0 :(得分:0)

您要解决的问题需要以下功能。但是我不确定您想要的是什么,因为它与您编写的功能无关。

NLS_LANG="ENGLISH_UNITED KINGDOM.AL32UTF8"

答案 1 :(得分:0)

虽然实际答案是“因为arr是实例,而不是对象定义”,但此处的实际要点信息更为重要,因此请继续阅读。

JavaScript是一种原型继承语言,这意味着可以使用new实例化任何带有原型的实例,并且所有这些实例都引用了单个权威的原型。实例很多,但只有一个原型。访问与实际对象函数关联的原型需要使用.prototype,通过特定实例访问它需要使用__proto__,但是任一访问器都返回相同的原型。因此,您不能做的一件事就是“向实例的原型添加一些东西”,因为没有“实例”原型,您将为该类型的对象修改通用原型。但是,您可以参考它:对其进行修改,对其进行修改。因此,其他所有内容仍与同一原型相关。您刚刚修改的。对于一切。

您想要的 外观是让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);

以此类推。数组原型已经具有 ton 个函数,以使所有这些工作成为可能,而不必编写污染原型的内容,因此请转到https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array,花10、15分钟阅读提供的功能(因为可能您可能不知道的吨数已经存在)和您的编程游戏=)

答案 2 :(得分:-1)

要回答您的问题,因为您试图将原型设置在没有原型的数组实例上,而不是在没有原型的Array对象上。

忽略该示例的其他问题,为数组提供一个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