新对象构造函数中的Javascript新数组原型

时间:2018-07-02 06:21:06

标签: javascript arrays constructor prototype

如果我这样做:

Array.prototype.test = "test"
Array.prototype.t = function() {return "hello"}

每个新的Array都将具有属性test和方法t

如何在不影响所有阵列的情况下执行相同的操作?

赞:

Names = function(arr){
  // Contacts constructor must be the same of Array 
  // but add the property test and the function t
}
z=new Names(["john","andrew"])

这样z.test将返回"test",而z.t()将返回"hello"吗? (但是Array.testArray.t将保持undefined

我的解释更好:

Array.prototype.t="test";
Array.prototype.test = function(){ return "hello";}

z=new Array("john", "andrew")
console.log(z);

但这会影响所有数组。 我想要相同的东西,但是要有一个继承Array构造函数的新构造函数名称。

4 个答案:

答案 0 :(得分:2)

class Names extends Array {
  constructor(...args) {
    super(...args);
  }
}

Names.prototype.t = 'test';

let z = new Names("john", "andrew")
z.push('Amanda')

console.log(z.t)
console.log(z)

您可以轻松地将其设置为Names.prototype

答案 1 :(得分:1)

您不能只扩展Array吗?

class Names extends Array {
  constructor(...args) {
    super(...args);
    this.t = "test";
  }

  test() { return "hello" }
}

let z = new Names("john", "andrew")

答案 2 :(得分:1)

这是一个粗略的实现:

function Names(arr) {
  this.contacts = enhanceArray(arr);
}

function enhanceArray(arr) {
  arr.test = 'helloProp';
  arr.t = function() {
    return 'helloFunc'
  }
  return arr;
}
let z = new Names(["john", "andrew"]);

console.log(z.contacts[0]);
console.log(z.contacts.test);
console.log(z.contacts.t());

答案 3 :(得分:0)

您可以创建自己的扩展Array构造函数工厂,例如

(() => {
  const myArr = XArray();
  let a = myArr(["John", "Mary", "Michael"]);
  console.log(`myArr(["John", "Mary", "Michael"]).sayHi(1): ${a.sayHi(1)}`);
  console.log("demo: myArr(1, 2, 3) throws an error");
  let b = myArr(1, 2, 3); // throws
  
  // an extended array
  function XArray() {
    const Arr = function(arr) {
      if (arr.constructor !== Array) {
        throw new TypeError("Expected an array");
      }
      this.arr = arr;
    };
    Arr.prototype = {
      sayHi: function (i) { return `hi ${this.arr[i]}`; }
    };
    return arr => new Arr(arr);
  }
})();