我一直在尝试更深入地学习Javascript中的OOP。在JavaScript中创建类和对象的方式不同。如果我理解正确,下面两种最流行的方式。但我不明白他们之间有什么不同。这些方法给出了完全相同的结果。如果它们完全相同,为什么有两种不同的方式呢?
V1
function Country(name){
this.name=name;
this.cities=[];
this.continent;
}
Country.prototype={
constructor:Country,
addCity:function(name){
this.cities.push(name)
},
setContinent:function(continent){
this.continent=continent;
}
}
V2
function Country(name){
this.name=name;
this.cities=[];
this.continent;
this.addCity=function(name){
this.cities.push(name);
}
this.setContinent=function(continent){
this.continent=continent;
}
}
谢谢你的四个好答案。我理解正确的区别。可能你知道,从EcmaScript6开始,就像在Java中创建类和对象一样。
加成
然后这个系统与原型方法相同,没有任何缺点。
class Country
{
constructor(name){
this.name=name;
this.cities=[];
this.continent;
}
addCity(name){
this.cities.push(name);
}
setContinent(continent){
this.continent=continent;
}
}
c1 = new Country()
c2 = new Country()
console.log(c1.addCity == c2.addCity) // gives true
我尝试了@ vothaison的方法,就像我说的那样,我猜这与原型方法相同。
答案 0 :(得分:5)
你的两种方式不一样,V1就是你要走的路。
使用V1,所有创建的Country实例将使用相同的addCity方法和setContinent方法。
在V2中,所有实例都有自己的addCity方法实例和setContinent方法,这是浪费资源。
您可以使用以下代码对其进行测试:
c1 = new Country()
c2 = new Country()
c1.addCity == c2.addCity // true in V1, false in V2
答案 1 :(得分:1)
建议使用V1。
Prototype Pattern创建新对象,但不是创建非初始化对象,而是返回使用从原型 - 或样本 - 对象复制的值初始化的对象。 Prototype模式也称为Properties模式。
MDN很好地解释了利弊:Inheritance and the prototype chain