Javascript прототип нового массива в конструкторе нового объекта - PullRequest
0 голосов
/ 02 июля 2018

Если я сделаю:

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.test и Array.t останутся undefined)

Я лучше объясню:

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

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

Но это влияет на ВСЕ массивы. Я хочу то же самое, но с новым конструктором Names, который наследует конструктор Array.

Ответы [ 4 ]

0 голосов
/ 02 июля 2018

Вот грубая реализация:

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());
0 голосов
/ 02 июля 2018

Вы можете создать свою собственную расширенную фабрику конструктора 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);
  }
})();
0 голосов
/ 02 июля 2018

Разве вы не можете просто продлить Array?

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

  test() { return "hello" }
}

let z = new Names("john", "andrew")
0 голосов
/ 02 июля 2018

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

...