Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Object_Prototypal Inheritance - Fatal编程技术网

面向对象JavaScript中的继承

面向对象JavaScript中的继承,javascript,oop,object,prototypal-inheritance,Javascript,Oop,Object,Prototypal Inheritance,我有三个目标,科学,物理和数学 我想要最后两个对象(物理和数学) 继承科学的原型属性 然而,我希望数学和物理都能更新继承的属性并定义它们。这已经完成了,但是当我试图通过一个物理实例来访问科学属性和方法时,我总是得到未定义的。我的代码可能有什么问题 功能日志(elem){ 返回控制台日志(elem); } //创建超类型=>Science 函数科学(){} //定义科学原型道具 科学.原型={ 建设者:科学, 难点:“变量”, 环球:没错, 类型:“科学”, 名称:“科学”, hasSubFie

我有三个目标,科学物理数学

我想要最后两个对象(物理数学) 继承科学的原型属性

然而,我希望数学和物理都能更新继承的属性并定义它们。这已经完成了,但是当我试图通过一个物理实例来访问科学属性和方法时,我总是得到未定义的。我的代码可能有什么问题

功能日志(elem){
返回控制台日志(elem);
}
//创建超类型=>Science
函数科学(){}
//定义科学原型道具
科学.原型={
建设者:科学,
难点:“变量”,
环球:没错,
类型:“科学”,
名称:“科学”,
hasSubFields(){
返回true;
},
};
//创建两个子领域:数学和物理,以继承科学的道具
函数数学(子领域){
this.subField=子字段;
}
函数物理(){}
//让数学和物理传承科学道具
数学。原型=
对象。创建(科学。原型);
物理.原型=
对象。创建(科学。原型);
Physics.prototype.constructor=物理;
//重写数学和物理继承的道具
数学。原型={
建造师:数学,
名称:“数学”,
类型:“纯科学和应用科学”,
};
物理.原型={
名称:“物理学”,
困难:“80%”,
类型:“物理科学”,
子领域:[“电”、“力学”、“声音”、“光学”、“波”],
};
//举例说明物理学
让力学=新物理学();
mechanics.name=“mechanics”;
mechanics.subFields=[“线性”、“力”、“力场”];
日志(力学,通用)
第二行正在覆盖第一行。一旦代码完成,原型就是新对象。不再与
科学
有任何关系,因此没有要继承的
通用
属性

您需要在原型中添加以下内容,而不是替换原型:

Physics.prototype = new Science();

//...

Physics.prototype.name = "Physics";
Physics.prototype.dificulty = "80%";
Physics.prototype.subFields = "Physical Science";
Physics.prototype.name = ["Electricity", "Mechanics", "Sound", "Optics", "Waves"];
或:

数学
将需要类似的更改

功能日志(elem){
返回控制台日志(elem);
}
//创建超类型=>Science
函数科学(){}
//定义科学原型道具
科学.原型={
建设者:科学,
难点:“变量”,
环球:没错,
类型:“科学”,
名称:“科学”,
hasSubFields(){
返回true;
},
};
//创建两个子领域:数学和物理,以继承科学的道具
函数数学(子领域){
this.subField=子字段;
}
函数物理(){}
//让数学和物理传承科学道具
数学.prototype=对象.create(科学.prototype);
Physics.prototype=Object.create(Science.prototype);
Physics.prototype.constructor=物理;
//重写数学和物理继承的道具
对象。分配(数学。原型{
建造师:数学,
名称:“数学”,
类型:“纯科学和应用科学”,
});
对象。分配(物理。原型{
名称:“物理学”,
困难:“80%”,
类型:“物理科学”,
子领域:[“电”、“力学”、“声音”、“光学”、“波”],
})
//举例说明物理学
让力学=新物理学();
mechanics.name=“mechanics”;
mechanics.subFields=[“线性”、“力”、“力场”];
日志(力学,通用)
第二行正在覆盖第一行。一旦代码完成,原型就是新对象。不再与
科学
有任何关系,因此没有要继承的
通用
属性

您需要在原型中添加以下内容,而不是替换原型:

Physics.prototype = new Science();

//...

Physics.prototype.name = "Physics";
Physics.prototype.dificulty = "80%";
Physics.prototype.subFields = "Physical Science";
Physics.prototype.name = ["Electricity", "Mechanics", "Sound", "Optics", "Waves"];
或:

数学
将需要类似的更改

功能日志(elem){
返回控制台日志(elem);
}
//创建超类型=>Science
函数科学(){}
//定义科学原型道具
科学.原型={
建设者:科学,
难点:“变量”,
环球:没错,
类型:“科学”,
名称:“科学”,
hasSubFields(){
返回true;
},
};
//创建两个子领域:数学和物理,以继承科学的道具
函数数学(子领域){
this.subField=子字段;
}
函数物理(){}
//让数学和物理传承科学道具
数学.prototype=对象.create(科学.prototype);
Physics.prototype=Object.create(Science.prototype);
Physics.prototype.constructor=物理;
//重写数学和物理继承的道具
对象。分配(数学。原型{
建造师:数学,
名称:“数学”,
类型:“纯科学和应用科学”,
});
对象。分配(物理。原型{
名称:“物理学”,
困难:“80%”,
类型:“物理科学”,
子领域:[“电”、“力学”、“声音”、“光学”、“波”],
})
//举例说明物理学
让力学=新物理学();
mechanics.name=“mechanics”;
mechanics.subFields=[“线性”、“力”、“力场”];

日志(力学,通用)实例化父类作为子类的原型是很奇怪的,在某些情况下可能会咬到你!我建议您将
Mathematics.prototype=new Science()
替换为
Mathematics.prototype=Object.create(Science.prototype)
Mathematics.prototype=Object.create(Science.prototype);Physics.prototype=Object.create(Science.prototype);Physics.prototype.constructor=物理实例化父类作为子类的原型是很奇怪的,在某些情况下可能会咬到你!我建议您将
Mathematics.prototype=new Science()
替换为
Mathematics.prototype=Object.create(Science.prototype)
Mathematics.prototype=Object.create(Science.prototype);Physics.prototype=Object.create(Science.prototype);Physics.prototype.constructor=物理
Object.assign(Physics.prototype,{名称:“Physics”,难度:“80%”,类型:“Physical Science”,
Physics.prototype = new Science();

//...

Object.assign(Physics.prototype, {
  name: "Physics",
  dificulty: "80%",
  type: "Physical Science",
  subFields: ["Electricity", "Mechanics", "Sound", "Optics", "Waves"],
});