Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我不能使用相同的名称访问父类属性?_Javascript_Node.js - Fatal编程技术网

Javascript 为什么我不能使用相同的名称访问父类属性?

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

我在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.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。这意味着我不能对两个类使用相同的属性名?