Javascript 为什么我不能使用相同的名称访问父类属性?
我在Javascript中有两个类A和B,A扩展了B,它们的构造函数中都有一个同名的属性 我试图从类B访问属性名的值,但从类A创建新对象时,它被替换为A B类{ 建造师{ this.name=我是B } 说话{ 返回此名称 } } A类延伸至B类{ 建造师{ 超级的 this.name=我是一个 } 斯帕卡{ 返回this.speakB+和+this.name; } } var b=新的b; console.logb.speakB//我是 var a=新的a;Javascript 为什么我不能使用相同的名称访问父类属性?,javascript,node.js,Javascript,Node.js,我在Javascript中有两个类A和B,A扩展了B,它们的构造函数中都有一个同名的属性 我试图从类B访问属性名的值,但从类A创建新对象时,它被替换为A B类{ 建造师{ this.name=我是B } 说话{ 返回此名称 } } A类延伸至B类{ 建造师{ 超级的 this.name=我是一个 } 斯帕卡{ 返回this.speakB+和+this.name; } } var b=新的b; console.logb.speakB//我是 var a=新的a; console.loga.spe
console.loga.speakA//I是A,I是当您使用派生类扩展类,然后实例化派生类时,那里只有一个对象。this.name引用该对象上相同的this和相同的属性,无论代码在哪个类中 这里的关键是基类和派生类只在一个对象上设置属性。因此,如果您使用的是相同的命名属性,那么无论哪个基类或派生类设置它,它都将是相同的值 这样想:
let obj = new A();
obj.name = "Bob";
只有一个对象具有一个.name属性。A和B的方法都在同一个对象上操作,因此在方法A和B中使用相同的属性名称将设置完全相同的属性
执行此操作时:
this.name = "I AM A".
在派生类中,您正在覆盖父级B为.name属性设置的上一个值
这意味着我不能对两个类使用相同的属性名 正确,如果您希望两个属性具有单独的值,则不正确。注意,在很多情况下,派生类希望访问基类设置的属性,因此这也是一个功能。但是,如果您希望两个属性对于base和derived是分开的,那么必须为它们指定不同的名称 对于某些人来说,一个可能的混淆源是,通过类语法声明的方法对于每个类都是分开的。每个类都有自己的prototype对象,在一个链中搜索原型以解析方法。这确实允许您专门调用基类方法,即使基类和派生类都定义了相同的命名方法
但是,对于常规实例属性分配this.x=foo,情况并非如此,因为这些属性分配给实例对象,而不是原型对象。请记住,原型是在所有对象实例之间共享的,因此您不能在原型上存储实例状态。与其他OOP语言相比,JS中的封装相对较少。在Java之类的东西中,您希望父对象的属性独立于子对象的属性。只要它们是单独声明的,父级中的公共字符串名称仍然可以通过子级中的this.name=something进行更改。但是在JS中,两个名称属性都引用相同的东西,这是因为它们都使用这个-没有区分属性来自何处。你在这里覆盖了B name属性的值this.name=I是A。这意味着我不能对两个类使用相同的属性名?