【问题标题】:Difference between JavaScript reference type objects and plain objectsJavaScript 引用类型对象和普通对象的区别
【发布时间】:2015-08-03 19:02:18
【问题描述】:

我目前正在学习 JavaScript。我对对象(引用类型和普通对象)感到困惑。以下是一些创建对象(引用类型)的代码:

function TheObject(first, last) {
  this.first = first;
  this.last = last;
}

TheObject.prototype.theMethod = function() {
  document.write("first : " + this.first + ", last : " + this.last + "</br>");
};

var anObject = new TheObject("Google", "Good");
anObject.theMethod();

这里还有一些其他代码也可以创建一个对象(它也是引用类型吗?):

var TheAnotherObject = function(first, last){
   return {
     first : first,
     last : last,

     theMethod : function() {
       document.write("first : " + this.first + ", last : " + this.last + "</br>");
     }
   };
 }

 var anotherObject = TheAnotherObject("Yahoo", "Good");
 anotherObject.theMethod();

现在,我的困惑是这两种创建对象的方式之间的实际区别在哪里。我知道我可以通过两种方式创建一个 Object 类型(使用“new”关键字)。那有什么区别呢?

请帮助我了解我在这里遗漏了什么。我知道理解这一点非常重要,因为 JavaScript 大量使用函数和对象。任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 第二种方法没有将原型与TheObject类关联。
  • 我可以猜测,但不知道你所说的“引用类型”是什么意思——你在哪里看到这个表达式?
  • @torazaburo 来自“Jeremy McPeak”的“Beginning Javascript”一书。我正在从这本书中学习。
  • 这不是标准术语,坦率地说是令人困惑的。虽然对于“JS 有没有类”这个问题众说纷纭,但是将通过new 创建对象的函数称为“类”是最简单最方便的,这样大家就差不多知道你在说什么了。跨度>

标签: javascript function object


【解决方案1】:

主要区别是:

第一种方法使用prototype 定义theMethod 方法。这意味着从 Class 创建的所有 instances 都将使用该方法的相同定义 (theMethod)

否则,每次从Class 创建一个新的instance 时,第二种方法都会定义一个新的theMethod 方法。显然,当实例太多时,它会很昂贵,因为theMethod 会做多个定义来做同样的事情。

【讨论】:

  • 当实例太多时,它会很昂贵。实际上,它并不昂贵,除非您计划拥有数百万个实例。这些天我们有比几个额外的内存字节更好的事情要担心。据我所知,Douglas Crockford 提倡这种编程风格。
【解决方案2】:

在创作方面,它们是相同的。

但不同之处在于方法被分配给原型的第一种方式,这意味着该方法只有一个实例。

而在第二个示例中,为每个新对象定义了方法。

所以基本上 theMethod 的引用并不相同,这意味着 o1.theMethod != o2.theMethod

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 2014-09-06
    • 2013-12-12
    • 2013-05-19
    • 2015-05-10
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多