JavaScript对象 - 根据上下文的不同类型

chr*_*ixm 5 javascript

我将首先说我不认为这是可能的,但希望有人知道JavaScript中的一些特殊方法来做到这一点.我有一个JavaScript对象定义如下:

var t = {
  "fields": {
    "a": ["99", "98"]
  }
};
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法,以便我可以使用不同的值定义数组的相同元素两次,可以在两个不同的上下文中使用 - 类似这样:

var t = {
  "fields": {
    "a": ["99", "98"],
    "a": "99|98"
  }
};
Run Code Online (Sandbox Code Playgroud)

如果我使用语法查询它将t.fields["a"]返回"99 | 98",但如果我使用t.fields["a"][0]它来查询它,那么它将返回"99".我理解如果我在没有指定索引的情况下查询数组,那么它会返回"99,98"作为字符串 - 但我需要它返回用"|"分隔的条目 代替 ",".

Mar*_*lli 2

为了实现您想要的目标,您有一些选择。根据您的编码风格、环境等,选择最适合您的选项。就在这里。

选项1

您可以轻松地将.toString()的 方法替换Array.prototype为返回由竖线 ( |) 而不是通常的逗号分隔的值。你可以这样做:

Array.prototype.toString = function() {
    return this.join("|");
};
Run Code Online (Sandbox Code Playgroud)

现在您可以轻松地做您想做的事:

var t = {
    "fields": {
        "a": ["99", "98"]
    }
};

console.log("My array is: " + t.fields);
// My array is: 99|98

console.log("Its first element is: " + t.fields[0]); 
// Its first element is: 99
Run Code Online (Sandbox Code Playgroud)

顺便说一句,更改默认对象的方法/属性并不总是最佳选择,因为某些库或本机方法可能会使用它们并导致错误,因为它们已被修改。

选项2

为了实现你想要的,如果你只需要处理几个数组,你可以修改它们的prototypes 而不是 default Array.prototype,如下所示:

// Let's assume you have arrays a, b and c
var a = [1, 2],
    b = [3, 4],
    c = [5, 6];

a.toString =
b.toString =
c.toString = function() {
    return this.join("|");
};
Run Code Online (Sandbox Code Playgroud)

如果您只使用很少的数组,这是一个更好的方法,否则更改您使用的每个数组的每个原型会很繁重,并且最好使用它Array.prototype(就像我的第一个示例)。

选项3

构建您自己的函数并使用它。建议这样做,因为它不会更改任何现有prototype方法,这可能会导致一些错误,具体取决于您使用数组的方式。

// Create your own function
function myJoin(array) {
    return array.join("|");
}

var a = [1, 2, 3];
myJoin(a); // "1|2|3"

// Or add it to the prototype
Array.prototype.myJoin = function() {
    return this.join("|");
}

var b = [11, 22, 33];
b.myJoin(); // "11|22|33"
Run Code Online (Sandbox Code Playgroud)

  • 我想这就是我一直在寻找的东西——我要尝试一下。虽然我可能只想在我的对象的上下文中更改它,否则它会改变其他事物的行为。我的工具使用户能够编写自己的 JavaScript 来扩展它。 (2认同)
  • 它完成了这项工作,但是并不真正建议更改公共对象原型:您必须知道它不仅会在这种特定情况下更改数组原型,而且还会更改在您的代码和其他 JS 代码中使用的任何其他数组已加载到页面中。当心副作用! (2认同)