JavaScript对象创建方法有什么区别?

时间:2016-12-28 10:29:51

标签: javascript class oop object

我一直在尝试更深入地学习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的方法,就像我说的那样,我猜这与原型方法相同。

2 个答案:

答案 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 Pattern创建新对象,但不是创建非初始化对象,而是返回使用从原型 - 或样本 - 对象复制的值初始化的对象。 Prototype模式也称为Properties模式。

MDN很好地解释了利弊:Inheritance and the prototype chain