【问题标题】:difference between various way of defining an object in javascript [duplicate]在javascript中定义对象的各种方式之间的区别[重复]
【发布时间】:2015-12-29 05:01:09
【问题描述】:

在 javascript 中,我们可以通过多种方式定义对象原型。

第一个

var foo={
a:1,
b:2
}

其次是

var foo=function(){
this.a=1;
this.b=2;
}

我知道第一个是对象本身,而要从第二个定义创建对象,我们必须使用 new foo()。这两个定义之间是否还有其他区别。如果两者都相同,那么第二个需要什么,如果不是,那么第一个需要什么?

【问题讨论】:

标签: javascript


【解决方案1】:

它们不一样,第二个是Object的构造函数:

var foo = {
  a: 1,
  b: 2
}
console.log("First: ",
    typeof foo, // object
    JSON.stringify(foo), // {a:1,b:2}
    foo.constructor) // function Object() { [native code] }

var foo = function() {
  this.a = 1;
  this.b = 2;
}
console.log("Second: ",
    typeof foo, // function
    JSON.stringify(foo), // undefined, foo is not an Object, it's a function!
    foo.constructor) // function Object() { [native code] }

var foo = new foo()
console.log("Thrid: ",
    typeof foo, // object
    JSON.stringify(foo), // {a:1,b:2}
    foo.constructor) // function() {  this.a = 1;  this.b = 2;}

因此,即使在创建了这两个对象之后,它们的.constructor 属性也会有所不同。因为第一个 Object 是由 JavaScript 中的 Native 构造函数或 Object 创建的,而第二个是由您的自定义构造函数创建的。

这是唯一的区别

【讨论】:

  • 我并不是说它们是相同的,但是一旦你为第二个定义做了 new foo() 你就会得到一个 object 。这些是定义对象行为和属性的各种方法。我想知道它们之间有什么区别,为什么我们需要第二种对象定义方式。
  • @Nitin9791 看代码后面的解释:)
  • "....constructor 属性不同。" -- 更重要的是,对象的原型链会有所不同! (例如,foo.prototype.bar = 6 将导致 bar 成为所有 foo 实例的继承属性)(@Nitin9791)
  • 很好,但如果两者不同,那么首先需要什么?是不是只做sinleton对象。
  • 需要first的好处是不需要构造函数吗?
猜你喜欢
  • 2017-09-16
  • 2014-06-23
  • 1970-01-01
  • 2015-12-16
  • 2011-03-08
  • 2013-01-10
  • 2016-04-20
  • 2021-07-24
  • 2023-03-15
相关资源
最近更新 更多