Подтвердить что ты не робот

Доступ к прототипу объекта Javascript

Как я понимаю, в JavaScript каждый объект имеет prototype и предоставляет некоторые свойства по умолчанию. У меня есть следующий код, где я пытаюсь установить свойство Year из двух объектов через prototype. Но оба вызова не работают.

Как я могу переопределить toLocalString() для любого объекта, если у меня нет доступа к prototype? Обратите внимание, что следующий код должен проверяться в свойстве prototype, но я намерен переопределить метод toLocalString().

var car = {
    Make: 'Nissan',
    Model: 'Altima'
};

car.Year = 2014;
alert(car.Year);

alert(car.prototype); // returns undefined

car.prototype.Year = 2014; // Javascript error

// --------------

function Car() {
    this.Make = 'NISSAN';
    this.Model = 'Atlanta';
}

var v = new Car();
v.prototype.Year = 2014; // JavaScript error
alert(v.prototype);
4b9b3361

Ответ 1

У вас есть доступ к свойству prototype, но он присутствует только на Function s.

var car = {
    Make: 'Nissan',
    Model: 'Altima'
}; 

Это то же самое, что:

var car = new Object();
car.Make = 'Nissan';
car.Model = 'Altima'; 

Итак, car.__proto__ === Object.prototype.

И car.prototype === undefined как свойство prototype присутствует только на Function (как я уже сказал).

function Car() {
    this.Make = 'NISSAN';
    this.Model = 'Atlanta';
}

Здесь Car.prototype указывает на экземпляр Object, потому что Car является функцией, и когда объявления функций оцениваются, их prototype устанавливается в экземпляр Object.

Car.prototype.Year = 2014; //all Car *instances* will have a Year property set to 2014 on their prototype chain.

var c = new Car(); //create an instance
console.log(c.Year); //2014

Переопределение метода, присутствующего в цепочке прототипов для объекта, так же просто, как создание соответствующего метода для объекта:

var myObject = new Object();
myObject.toLocaleString = function() {
  //my own implementation
};

Ответ 2

Вероятно, вы захотите изменить прототип функции конструктора:

function Car(year, make, model) {
  this.year  = year;
  this.make  = make;
  this.model = model;
}

Car.prototype.toLocaleString = function() {
  return [this.year, this.make, this.model].join(' ');
};

var civic = new Car(2014, 'Honda', 'Civic');
civic.toLocaleString(); // => "2014 Honda Civic"

Эта статья MDN на Object.prototype может быть полезна.