Изменение значения в прототипе не работает в JavaScript

Я новичок в JS, давайте посмотрим на мой код ниже.

Я хочу изменить значение свойства leg мыши на 2 при использовании прото, но я не могу его изменить. Все, что я получаю на выходе - 4. Пожалуйста, помогите, почему это?

function Animal() {
  this.legs = 4;
}

var mouse = new Animal();

mouse.__proto__.legs = 2;
console.log(mouse.legs);

3 ответа

Решение

Как уже отмечалось, участок, к которому вы пытаетесь получить доступ, является собственностью, а не прототипом.

Ниже приведен пример:

function Animal() {
  this.legs = 4;
}
Animal.prototype.legs = 8;
var mouse = new Animal();

mouse.legs = 2;
console.log(mouse.legs, mouse.__proto__.legs);


Тем не менее, если вы хотите иметь реализацию концепции переопределения, всегда помните, никогда не изменяйте / изменяйте свойство в прототипе.

Идея состоит в том, чтобы иметь общее свойство на прототипе и иметь собственное свойство на себя.

Ниже приведен пример, изображающий то же самое:

function Animal() { this.legs = 4; }
function Reptile() { this.legs = 4; }

Reptile.prototype = new Animal();
var mouse = new Reptile();
console.log('Mouse details : ', mouse.legs, mouse.__proto__.legs);

var snake = new Reptile();
snake.leg = 0;
console.log('Snake details : ', snake.legs, snake.__proto__.legs);

snake.__proto__.legs = 0;

console.log('After mutation')

console.log('Mouse details : ', mouse.legs, mouse.__proto__.legs);
console.log('Snake details : ', snake.legs, snake.__proto__.legs);


Проще говоря, все в JS является объектом. Когда вы создаете объект, он имеет 2 вложенных уровня по умолчанию:

-> это
-> __proto__

Любое свойство вашего конструктора отправляется в this, Любое свойство на его прототипе идет в __proto__, Поскольку все объекты наследуются от Object есть цепочка до глобального объекта.

Вы не можете изменить свойство экземпляра таким образом.

mouse.__proto__ содержит функцию конструктора Animal,

Если вы хотите изменить только ноги мыши, вы должны сделать это следующим образом:mouse.legs = 2

Если вы хотите изменить каждого будущего животного - вы, к сожалению, не можете. new Animal() всегда будет ссылаться на оригинальную функцию конструктора.

Когда вы звоните new Animalдвигатель JS не ссылается Animal.prototype.constructor, он использует Animal в качестве функции конструктора и Animal.prototype как прототип вновь созданного объекта, игнорируя Animal.prototype.constructor,

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

function Animal() {
  this.legs = 4;
}

var mouse = new Animal();

// mouse.__proto__.legs = 2;
//instead do this
mouse.legs = 2;
console.log(mouse.legs);
Другие вопросы по тегам