在原型中更改值在 JavaScript 中不起作用



我是JS的新手,让我们看看我的代码。

我想在使用proto时将鼠标的 legs 属性值更改为 2,但我无法更改它。我得到的输出是 4。请帮忙,这是为什么?

function Animal() {
this.legs = 4;
}
var mouse = new Animal();
mouse.__proto__.legs = 2;
console.log(mouse.legs);

不能以这种方式更改实例属性。

mouse.__proto__包含构造函数Animal

如果你只想改变老鼠的腿,你必须这样做:mouse.legs = 2

如果你想改变每一个未来的动物 - 不幸的是你不能。new Animal()将始终引用原始构造函数。

调用new Animal时,JS引擎不引用Animal.prototype.constructor,它使用Animal作为构造函数,Animal.prototype作为新创建对象的原型,忽略Animal.prototype.constructor

如前所述,您尝试访问的腿是自有财产,而不是原型。

下面是一个示例:

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继承的,所以有一个链直到全局对象。

所有 JavaScript 对象都从原型继承属性和方法。一旦它被继承,你可以直接调用或更改它的值。

function Animal() {
this.legs = 4;
}
var mouse = new Animal();
// mouse.__proto__.legs = 2;
//instead do this
mouse.legs = 2;
console.log(mouse.legs);

最新更新