2016-01-28 43 views
7

所以我试图围绕不同的方式来创建一个对象。构造器模式和原型模式之间的区别

我来到创造对象的原型模式。

现在我在下面写了两个函数,但是我看不出两者之间的功能差别是什么?什么时候使用构造函数模式,什么时候使用Prototype模式?

构造模式

function Fruit(){} 
Fruit.color = "Yellow", 
Fruit.fruitName = "Banana", 
Fruit.nativeTo = "SomeValue" 

原型模式

function Fruit(){} 
Fruit.prototype.color = "Yellow", 
Fruit.prototype.fruitName = "Banana", 
Fruit.prototype.nativeTo = "SomeValue" 
+1

我觉得最大的区别之一是创建水果的新实例与它的所有方法和属性的能力使用Prototype模式。在您的构造函数示例中:如果您尝试为像Fruit x = new Fruit()这样的Fruit创建一个新对象,然后尝试访问像x.color这样的属性,那么您将在Prototype中执行相同的操作时得到未定义的对象, ”。 – gothical

回答

12

可重用的组件......

构造

当您创建新的构造函数时,您将创建一切的新实例,重要的是对实例所做的任何更改只会影响它们,而不会影响其他实例。

原型

当您使用原型它会重复使用逻辑和原型链中的任何改变都会影响其他人的新对象。

这是一个很好的解释:Javascript prototypes and instance creation

当使用每个模式是基于需求的 - 很含糊的答案,但从未在少的情况。

想想他们在整个JS中使用的对象,函数,数组,他们会在原型链上生活,因为我们想要传播的对他们的任何更改 - 附注:这就是为什么我们应该从不改变这些因为它可以搞砸他们的行为。

这里

最好的解释:JavaScript constructors, prototypes, and the new keyword

+1

感谢您花时间回答我的问题。你最后一个链接看起来很有前途生病肯定要看看它! –

+0

@MarcoGeertsma - 我的荣幸! –

1

变化原型的属性将适用于所有的情况下,包括已经存在,那里的财产,是由构造函数创建的改变只会改变它的实例

2

构造函数

基本上构造函数用于使用new运算符创建对象。

它用于初始化constructor.So的实例属性,constrctor新的无非但面向对象语言,如C++类的实现,JAVA有。

每个构造函数都有属性prototype,它们持有对构造函数的引用。

原型

的JavaScript缺乏基于类的继承。我们使用Prototype来实现单层继承。

因此,为了在JavaScript中实现代码可重用性,使用了原型。它只是原型继承。

在原型添加原型继承,方法或属性可立即对象来自同一个构造函数创建

相关问题