Доступ к прототипу объекта 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);

person wonderful world    schedule 01.10.2014    source источник
comment
В вашем нижнем примере это должно быть Car.prototype.Year = 2014 - вы устанавливаете прототип для объектной функции, а не для созданного экземпляра.   -  person tymeJV    schedule 01.10.2014
comment
Вы имеете в виду toLocaleString() вместо toLocalString() или хотите реализовать свой собственный метод toLocalString()?   -  person keenthinker    schedule 02.10.2014
comment
Ознакомьтесь с этим ответом   -  person frogatto    schedule 02.10.2014
comment
Свойство prototype принадлежит функции. Функция использует это свойство prototype при вызове с new для создания объектов экземпляра. Установка prototype на нефункциональном объекте не имеет никакого эффекта.   -  person apsillers    schedule 02.10.2014


Ответы (2)


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

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

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

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

So, car.__proto__ === Object.prototype.

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

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
};
person Ben Aston    schedule 01.10.2014

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

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 могла бы быть полезный.

person maerics    schedule 01.10.2014