Изменение значения в прототипе не работает в 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);