Javascript 什么';return和new关键字构造函数模式之间的区别是什么?
考虑以下代码:Javascript 什么';return和new关键字构造函数模式之间的区别是什么?,javascript,object,javascript-objects,Javascript,Object,Javascript Objects,考虑以下代码: var Animal = function(name) { return { name: name, speak: function() { return "My name is " + name; } }; }; var cat = Animal("Kitty"); 我的问题是:在性能、约定或最佳实践方面,上述代码与以下代码有什么区别: var Animal = function(name) { this.name = name, this.
var Animal = function(name) {
return {
name: name,
speak: function() { return "My name is " + name; }
};
};
var cat = Animal("Kitty");
我的问题是:在性能、约定或最佳实践方面,上述代码与以下代码有什么区别:
var Animal = function(name) {
this.name = name,
this.speak = function() { return "My name is " + name; }
};
var cat = new Animal("Another Kitty");
哪一个更好?对于<代码>新的< /COD>关键字[,当你考虑原型(以及它们控制的所有东西,比如继承)时,它们都是完全不同的。例如:
var SimpleAnimal=函数(名称){
返回{
姓名:姓名,,
speak:function(){return“我的名字是”+name;}
};
};
var RealAnimal=函数(名称){
this.name=name,
this.speak=function(){return“我的名字是”+name;}
};
var simpleCat=SimpleAnimal(“Kitty”);
var realCat=新的RealAnimal(“另一只小猫”);
console.log(SimpleAnimal的simpleCat实例,RealAnimal的realCat实例);//simple不是构造函数的实例
console.log(simpleCat.constructor、realCat.constructor);//因为它使用对象文本构造函数,第一个版本返回一个简单的对象,第二个版本创建一个新的动物
第一个版本适用于小型数据对象。它们可以存储不同的值,基本上就是这样。它们不需要很多内存
第二个是用于较大的对象。您可以将原型附加到它们,并使用“this”关键字访问对象的属性。因为每个对象都具有相同的属性,所以它们比第一种方法占用的空间要大得多
让我们看下面的内容并创建一个向量对象。使用第一种方法,您可以执行以下操作:
function createVector(x, y) {
return {
x: x,
y: y
};
}
//Add to vectors together
function add(vec1, vec2) {
return {x: vec1.x + vec2.x, y: vec1.y + vec2.y};
}
add(createVector(1, 1), createVector(1, 2)); //return {x: 2, y: 3}
这可能非常有用,但如果您想要有多种类型的向量(三维、四维等),该怎么办?您需要为加法器函数指定一个单独的名称,这不是很好。这就是第二种方法的用武之地。它可以将函数分隔为不同的名称空间:
function Vector2(x, y) {
this.x = x;
this.y = y;
}
//Add vectors together:
Vector2.prototype.add = function(vec) {
this.x += vec.x;
this.y += vec.y;
};
new Vector2(1, 1).add(new Vector2(1, 2)); //{x: x, y: y}
这样,您可以创建多个向量类型,并且每个向量类型都可以有一个单独的add函数,而不会相互干扰
你应该根据你想要达到的目标来使用这两种方法。这里有一个不错的起点,可以让你的仓鼠轮子转动:请将你的问题限制在客观差异上。对于主要基于观点的问题,有一个特定的离题原因,这就是你的问题在当前状态下的表现。第一个问题创建一个普通对象,第二个问题创建一个动物
实例(“继承”自动物。原型
)。“哪一个更好?”取决于你问谁。有些人不惜一切代价试图避免新的
。Rafay可能会重复,而这个问题可能会重复,谢谢你的提问。副本也很有用,因为它们会添加新的关键字来查找相同的信息。这是我在这个主题上看到的示例中最清晰、最简洁的演示。