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可能会重复,而这个问题可能会重复,谢谢你的提问。副本也很有用,因为它们会添加新的关键字来查找相同的信息。这是我在这个主题上看到的示例中最清晰、最简洁的演示。