更改原型中的值在 JavaScript 中不起作用
changing value in prototype does not work in JavaScript
我是 JS 新手,让我们看看下面的代码。
我想在使用 proto 时将鼠标的腿 属性 的值更改为 2,但我无法更改它。我得到的输出只有 4。请帮忙这是为什么?
function Animal() {
this.legs = 4;
}
var mouse = new Animal();
mouse.__proto__.legs = 2;
console.log(mouse.legs);
如评论所述,您尝试访问的支路是自己拥有的 属性 而不是原型。
示例如下:
function Animal() {
this.legs = 4;
}
Animal.prototype.legs = 8;
var mouse = new Animal();
mouse.legs = 2;
console.log(mouse.legs, mouse.__proto__.legs);
就是说,如果您希望实现覆盖概念,请永远记住,永远不要 mutate/change 属性 在原型上。
想法是在原型上使用通用 属性,在自身上使用自定义 属性。
以下是描述相同内容的示例:
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);
我是 JS 新手,让我们看看下面的代码。
我想在使用 proto 时将鼠标的腿 属性 的值更改为 2,但我无法更改它。我得到的输出只有 4。请帮忙这是为什么?
function Animal() {
this.legs = 4;
}
var mouse = new Animal();
mouse.__proto__.legs = 2;
console.log(mouse.legs);
如评论所述,您尝试访问的支路是自己拥有的 属性 而不是原型。
示例如下:
function Animal() {
this.legs = 4;
}
Animal.prototype.legs = 8;
var mouse = new Animal();
mouse.legs = 2;
console.log(mouse.legs, mouse.__proto__.legs);
就是说,如果您希望实现覆盖概念,请永远记住,永远不要 mutate/change 属性 在原型上。
想法是在原型上使用通用 属性,在自身上使用自定义 属性。
以下是描述相同内容的示例:
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);