Javascript 我试图使用原型函数修改构造函数中的变量,但得到了意外的结果

Javascript 我试图使用原型函数修改构造函数中的变量,但得到了意外的结果,javascript,prototype,Javascript,Prototype,我以为我理解javascript中的构造函数和原型,直到我写了这段代码并得到了意想不到的结果 职能人员(){ 年龄=18岁; Person.prototype.getAge=函数(){ 回归年龄; }; Person.prototype.setAge=函数(值){ 年龄=价值; } this.getAge1=函数(){ 回归年龄; }; this.setAge1=函数(值){ 年龄=价值; } }; var marry=新人(); var jack=新的人(); console.log(mar

我以为我理解javascript中的构造函数和原型,直到我写了这段代码并得到了意想不到的结果

职能人员(){
年龄=18岁;
Person.prototype.getAge=函数(){
回归年龄;
};
Person.prototype.setAge=函数(值){
年龄=价值;
}
this.getAge1=函数(){
回归年龄;
};
this.setAge1=函数(值){
年龄=价值;
}
};
var marry=新人();
var jack=新的人();
console.log(mary.getAge())//产出18
console.log(jack.getAge())//产出18
log(mary.getAge1())//产出18
console.log(jack.getAge1())//产出18
玛丽=新人();
杰克=新人();
结婚。年龄(22岁);
console.log(mary.getAge())//产出22
console.log(jack.getAge())//产出22
log(mary.getAge1())//产出18
console.log(jack.getAge1())//产出22
玛丽=新人();
杰克=新人();
杰克·塞奇(22);
console.log(mary.getAge())//产出22
console.log(jack.getAge())//产出22
log(mary.getAge1())//产出18
console.log(jack.getAge1())//输出v 22
玛丽=新人();
杰克=新人();
第1组(22);
console.log(mary.getAge())//产出18
console.log(jack.getAge())//产出18
log(mary.getAge1())//产出22
console.log(jack.getAge1())//产出18
玛丽=新人();
杰克=新人();
jack.设置1(22);
console.log(mary.getAge())//产出22
console.log(jack.getAge())//产出22
log(mary.getAge1())//产出18
console.log(jack.getAge1())//输出22
  • Person.prototype.getAge
    只是一个函数,同一个变量
    age
  • 由于关闭
    this.getAge1
    对于每个对象都是单独的。这样它就不会改变其他对象的私有属性,即
    年龄
使用
Person.prototype.getAge=funct…
时。它更新
getAge()
。方法。对于两个对象。

但是,当您为this.get/setAge1指定一个新值时,它不会更改其他对象的
getAge1()

  • Person.prototype.getAge
    只是一个函数,同一个变量
    age
  • 由于关闭
    this.getAge1
    对于每个对象都是单独的。这样它就不会改变其他对象的私有属性,即
    年龄
使用
Person.prototype.getAge=funct…
时。它更新
getAge()
。方法。对于两个对象。


但是,当您指定
this.get/setAge1
一个新值时,它不会更改其他对象的
getAge1()

问题似乎更多的是闭包,而不是原型

因为原型方法对于所有对象都是通用的,并且您的原型方法设置正在更新闭包年龄

现在,每次创建对象时,它都会为其创建一个新的闭包,因此您的原型将引用上次创建的闭包

检查下面的示例,无论您为哪个对象设置值,它都将始终为最后一个对象更新

这就是为什么在大多数情况下在函数中使用原型不是一个好主意

有关更多信息,请参阅

职能人员(){
年龄=18岁;
Person.prototype.getAge=函数(){
回归年龄;
};
Person.prototype.setAge=函数(值){
年龄=价值;
}
this.getAge1=函数(){
回归年龄;
};
this.setAge1=函数(值){
年龄=价值;
}
};
玛丽=新人();
杰克=新人();
结婚。年龄(22岁);
console.log(mary.getAge())//产出22
console.log(jack.getAge())//产出22
log(mary.getAge1())//产出18
console.log(jack.getAge1())//产出22
console.log(“-------------------------------------------------------------”)
杰克=新人();
玛丽=新人();
结婚。年龄(22岁);
console.log(mary.getAge())//产出22
console.log(jack.getAge())//产出22
log(mary.getAge1())//产出22

console.log(jack.getAge1())//输出18
问题似乎更多的是闭包,而不是原型

因为原型方法对于所有对象都是通用的,并且您的原型方法设置正在更新闭包年龄

现在,每次创建对象时,它都会为其创建一个新的闭包,因此您的原型将引用上次创建的闭包

检查下面的示例,无论您为哪个对象设置值,它都将始终为最后一个对象更新

这就是为什么在大多数情况下在函数中使用原型不是一个好主意

有关更多信息,请参阅

职能人员(){
年龄=18岁;
Person.prototype.getAge=函数(){
回归年龄;
};
Person.prototype.setAge=函数(值){
年龄=价值;
}
this.getAge1=函数(){
回归年龄;
};
this.setAge1=函数(值){
年龄=价值;
}
};
玛丽=新人();
杰克=新人();
结婚。年龄(22岁);
console.log(mary.getAge())//产出22
console.log(jack.getAge())//产出22
log(mary.getAge1())//产出18
console.log(jack.getAge1())//产出22
console.log(“-------------------------------------------------------------”)
杰克=新人();
玛丽=新人();
结婚。年龄(22岁);
console.log(mary.getAge())//产出22
console.log(jack.getAge())//产出22
log(mary.getAge1())//产出22
console.log(jack.getAge1())//输出18