javascript - javascript的3个对象声明有什么区别

标签 javascript

总而言之,我发现在javascript中有3种声明对象的方法。

var Waffle = {
   tastes:'yummy'
};

var Waffle = function()
{
   this.tastes='yummy';
};

function Waffle() {
   var that = {};
   that.tastes = "yummy";
   return that;
}

第一种方式是对象字面量,它没有构造函数。 我认为下面是 Object literal 的相同方法。

var Waffle = new Object();
Waffle.tastes = 'yummy';

(如果我的理解有误,请指正。)

我想知道这3种方式有什么区别。

哪个是最好的选择?

谢谢。

最佳答案

文字符号和new Object() 创建一个对象,其原型(prototype)直接是Object。此外,属性和方法附加在实例上。

/*

Object
  A 
  | instance.__proto__
  | 
instance

*/

//all 3 yield the same result

var foo1 = {
  bar : 'bam!'
}

var foo2 = {}
foo2.bar = 'bam!';

var foo3 = new Object();
foo3.bar = 'bam!';

literal

构造函数方法,无论是声明函数还是分配函数表达式方法,在实例和 Object 之间都有一个额外的原型(prototype)级别,它包含附加到构造函数原型(prototype)的原型(prototype)函数。所有实例都共享附加到构造函数原型(prototype)的任何内容。

/*

Object 
  A 
  | instance.__proto__.__proto__
  | 
constructor.prototype 
  A
  | instance.__proto__
  |
instance

*/

//these 2 are the same
//bar is attached at the instance

//function expression assigned to variable foo1
var foo1 = function(){
  this.bar = 'bam!'
}

//function declaration named foo2
function foo2(){
  this.bar = 'bam!'
}

//==========================================================================//

//these 2 are the same, but not the same as above
//methods live on the prototype level and are shared across instances

//function expression assigned to variable foo1
var foo1 = function(){}

//function declaration named foo2
function foo2(){}

foo1.prototype.bar = 'bam!'
foo2.prototype.bar = 'bam!'

constructor

第三种方法返回一个新的文字。您无法获得构造函数方法和原型(prototype)共享的好处。就好像您只是像普通函数一样调用 Waffle,创建一个文字、附加的属性和方法,然后返回它。

最佳选择:取决于目的。

对象字面量:

  • new Object 更短,可以在定义时附加方法/属性。
  • 属性/方法存在于实例中,没有沿着原型(prototype)链运行,这意味着查找速度更快。
  • 未优化的对象创建可能会导致重复,从而浪费内存。例如,为每个实例创建函数而不是通过原型(prototype)共享。

构造函数:

  • 经典的 OOP 风格
  • 继承
  • 与每个实例方法相比,通过原型(prototype)共享方法意味着使用更少的内存。
  • 忘记 new 可能会产生不良后果,例如附加全局变量(如果 window 是上下文)

您可以在 Chrome 开发者工具中查看这些内容。在控制台中创建它们,并在“源”选项卡中查看这些表达式

关于javascript - javascript的3个对象声明有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15996735/

相关文章:

javascript - 具有 TimeStamp 属性的 jQuery float 据

javascript - Console.log 给出正确的输出,但在访问设置值时给出错误的输出

javascript - 根据 URL 动态加载 HTML

javascript - 如何 - 在 Mac 上测试 JS 触摸事件

javascript - 制作下拉单位转换器,但当我选择选项时无法更改它

javascript - 如何在 JSON 上应用复杂的数据过滤器,例如 SQL where 子句

javascript - 根据选择字段自动检查复选框

javascript - 将模拟注入(inject) AngularJS 服务

javascript - 如何仅显示 3 秒的 div,然后使用 jquery 再次消失?

javascript - 指定变量类型可以是两个值中的任意一个