所以我试图围绕创建对象的不同方式。
我遇到了用于创建对象的Protoype模式。
现在我在下面写了两个函数,但我看不出两者之间的功能差异是什么?您何时使用构造函数模式以及何时使用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"
答案 0 :(得分:15)
组件的可重用性......
构造强>
当你创建一个新的构造函数时,你将创建一个新的实例,重要的是,对实例所做的任何更改只会影响它们,而不会影响其他实例。
<强>原型强>
使用原型创建新对象时,它将重用逻辑,对原型链的任何更改都会影响其他所有人。
这是一个很好的解释:Javascript prototypes and instance creation
何时使用每种模式都是基于需求 - 非常模糊的答案,但从来没有这种情况。
想想它们在整个JS中使用的对象,函数,数组,并且它们可以理解它们存在于原型链中,因为我们想要传播它们对它们的任何改变 - 侧面注释:这就是为什么我们应该永远不会改变这些,因为它可以搞砸他们的行为。
最佳解释:JavaScript constructors, prototypes, and the new
keyword
答案 1 :(得分:2)
构造强>
基本上构造函数用于创建具有new
运算符的对象。
它用于初始化构造函数的实例属性。因此,带有new的constrctor只不过是面向对象语言的类的实现,如C ++,JAVA所具有的。
每个构造函数都有属性prototype
,其中包含对构造函数的引用。
<强>原型强>
JavaScript缺乏基于类的继承。
在JavaScript中实现inheritance
,我们使用Prototype
来实现单级继承。
因此,为了在JavaScript中实现代码可重用性,使用了原型。它只不过是原型继承。
在原型继承中,原型上添加的方法或属性可立即用于从相同构造函数创建的对象
答案 2 :(得分:1)
原型属性的更改将适用于包括已存在的所有实例,其中由构造函数创建的属性更改将仅为实例更改
答案 3 :(得分:0)
构造函数模式: 构造器模式是在JS中创建对象的最流行方法之一。 缺点是,对于我们创建的每个对象,都会创建函数副本,这是非常低效的方式。
JS中的原型: 它是每个对象的共享区域,如果您添加一些内容,那么它对于由同一构造函数创建的所有对象都是可用的。
原型模式: 原型模式是编写构造器模式的一种增强方式,其中我们将函数从构造器移到了构造器原型。 (我们这样做是由于上面构造函数模式中解释的缺点)
现在回到使用初始问题==>“何时使用构造函数模式以及何时使用原型模式?” 如果我们必须创建没有函数的简单对象,那么构造函数模式是不错的选择,但是如果有函数,那么原型模式将是一种有效的方法。