Javascript 类与原型继承进行比较

Javascript 类与原型继承进行比较,javascript,ecmascript-6,Javascript,Ecmascript 6,我试图理解当您使用ES6创建一个类的新实例时,实际会发生什么。据我所知,一个新实例是用构造函数中定义的属性创建的,然后类中的其余方法实际上是原型对象上的属性 比如说 class Dog { constructor(name){ this.name = name } speak (){ console.log('Woof') } } 将等同于 function Dog(name){ this.name = name; } D

我试图理解当您使用ES6创建一个类的新实例时,实际会发生什么。据我所知,一个新实例是用构造函数中定义的属性创建的,然后类中的其余方法实际上是原型对象上的属性

比如说

class Dog {
    constructor(name){
      this.name = name
    }

    speak (){
        console.log('Woof')
    }
}
将等同于

function Dog(name){
    this.name = name;
}

Dog.prototype.speak = function () {
    console.log('Woof');
}

在课堂示例中。如果我创建一个Dog类的实例,那么该方法的原型是指向Dog类本身还是一个全新的对象?因为当我
Object.getPrototypeOf(myDog)
返回
Dog{}
时,它们在功能上完全相同。以下是一些关于原型和类的有趣属性:

类Dog1{
建造师(姓名){
this.name=name
}
speak(){//将speak方法添加到Dog1的原型中
控制台日志('Woof')
}
}
Dog1.prototype.speak=()=>{//将speak方法覆盖到Dog1的原型
console.log(“不同的纬线”);
}
console.log(Dog1类型);//Class关键字只是构造函数的语法糖
const newDog=newdog1('barkie');
newDog.speak();
/////////////////////////////
函数Dog2(名称){
this.name=名称;
}
Dog2.prototype.speak=()=>{
控制台日志(“Woof”);
}
const aDog=new Dog2('fluffy');
aDog.uuu proto_uuuu.speak();//__proto__属性引用原型

aDog.speak();//__proto__属性不是必需的,如果在对象本身上找不到该属性,它将自动爬升protochain。
JS类语法的可能重复只是原型的语法糖。在这两种情况下,
.getPrototypeOf()
将指向对象
Dog.prototype
。在内部,类语法将被“重写”为原型语法。它在调试器中的显示方式将取决于哪个浏览器/调试器。我明白了,所以它的作用基本相同。所以,当我在类Dog中设置speak方法时,实际上是在Dog.prototype中设置了一个名为speak的方法吗?是的,所有用类语法定义的方法都成为prototype对象中的函数。谢谢你,这让它更清晰了!如果你教人们
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu:)的存在,
…或者更好的是,根本不教他们关于
\uuuu proto\uuuu
,只使用
Object.getPrototypOf
!谢谢,这非常有帮助,非常有意义。