两个JavaScript类之间的差异以及prototype为什么会';我不在Emp课上工作

两个JavaScript类之间的差异以及prototype为什么会';我不在Emp课上工作,javascript,javascript-objects,Javascript,Javascript Objects,(函数(){ var Emp=函数(_名称,_薪资){ 变量名称=_名称; var工资=\u工资 返回{ 姓名:姓名,, 薪金:薪金 }; } Emp.prototype.work=函数(){ console.log('这是工作',这是); } var Car=功能(\u名称,\u型号){ this.name=\u name; this.model=\u model; } Car.prototype.drive=函数(){ log('这是驱动器',这是); } var汽车=新车(“宝马”、“20

(函数(){
var Emp=函数(_名称,_薪资){
变量名称=_名称;
var工资=\u工资
返回{
姓名:姓名,,
薪金:薪金
};
}
Emp.prototype.work=函数(){
console.log('这是工作',这是);
}
var Car=功能(\u名称,\u型号){
this.name=\u name;
this.model=\u model;
}
Car.prototype.drive=函数(){
log('这是驱动器',这是);
}
var汽车=新车(“宝马”、“2015”);
car.drive();//工作正常
var emp=新emp('peter','1234');
emp.work();//类型错误
})();在关于
新的
运算符的中,解释了该运算符的基本功能:

执行代码newfoo(…)时,会发生以下情况:

  • 创建一个新对象,继承自Foo.prototype
  • 使用指定的参数调用构造函数Foo,并且 将其绑定到新创建的对象。新的Foo相当于 new Foo(),即如果未指定参数列表,则调用Foo 没有争论
  • 构造函数返回的对象 成为整个新表达式的结果如果构造函数 函数不显式返回在中创建的对象 而使用步骤1。(通常构造函数不返回值, 但是,如果他们想超越正常情况,他们可以选择这样做 对象创建过程。)
  • 作为
    Emp
    构造函数的最后一步

    return {
        name: name,
        salary: salary
    };
    

    您“覆盖”了返回步骤1中创建的对象的默认行为,因此您不会从函数原型继承。在Emp函数构造函数中,您返回了匿名对象的实例

    return {
                    name: name,
                    salary: salary
                };
    
    对象

    {
                        name: name,
                        salary: salary
                    };
    

    没有方法工作

    Emp
    不是一个构造函数,只是一个工厂。它不会将
    Emp.prototype
    分配给它实例化的对象。