如何从javascript函数创建对象

时间:2018-04-20 17:18:59

标签: javascript

我试图了解对象和JavaScript。

我遇到的问题是,似乎以下两者都做同样的事情。我的研究没有说明存在什么(如果有的话)差异,但这可能是因为在搜索框中很难对此提出疑问。

在代码中,我添加了评论来强调差异

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<div id = "results"></div>
  <script>

"use strict";
const results = document.getElementById("results");

const Thing = function(){                /* ****** THIS */
      var _x;
      this.set = function(x){
      _x = x;
      },

        this.alert = function(){
            results.innerHTML += _x + "<br />";
        };
    };

    function Other(){                    /* ****** AND THIS */
        var _x;
      this.set = function(x){
      _x = x;
      },

        this.alert = function(){
            results.innerHTML += _x + "<br />";
        };
    };

    const t = new Thing();
    t.set("b");
    t.alert();
    const t2 = new Thing();
    t2.set("b2");
    t2.alert();
    t.alert();
    t2.alert();

    const o = new Other();
    o.set("d");
    o.alert();
    const o2 = new Thing();
    o2.set("d2");
    o2.alert();
    o.alert();
    o2.alert();

  </script>
</body>
</html>

JSFIDDLE

有什么区别或它们都有效?

修改

我看过重复的var functionName = function() {} vs function functionName() {}。问题之间的区别在于我使用的是new这个词。我的问题是,这确实有所作为吗?

2 个答案:

答案 0 :(得分:2)

你可能会觉得这很有趣。

  1. 无论函数声明或表达如何,都可以使用new

  2. 查看控制台输出。 New创建了该函数的新实例。似乎没有任何其他副作用。

  3. function funcOne() {};

    var f1 = funcOne;
    var f2 = funcOne;
    
    var fx = new funcOne();
    
    console.log(funcOne==f1); //true
    console.log(f1==f2); //true
    console.log(funcOne==fx); //false
    
    const funcTwo = function(){};
    
    var f3 = new funcTwo();
    var f4 = new funcTwo();
    
    console.log(funcTwo==f3) //false
    console.log(f3==f4); //false
    

    如果您正在寻找一些关于函数作为对象的讨论,我推荐这个帖子javascript : function and object...?

答案 1 :(得分:2)

new采取的步骤是(from MDN):

  
      
  1. 创建一个新对象,继承自Foo.prototype。
  2.   
  3. 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象。新的Foo是   相当于新的Foo(),即如果没有指定参数列表,则Foo为   无争议地召集。
  4.   
  5. 构造函数返回的对象成为整个新表达式的结果。如果构造函数没有   显式返回一个对象,使用在步骤1中创建的对象   代替。 (通常构造函数不返回值,但它们可以   如果他们想要覆盖正常的对象创建,请选择这样做   过程。)
  6.   

在那一点上使用函数表达式或函数声明并不重要;只是你使用了一个函数。

function Foo() {
    this.hello = "world";
}

const Bar = function() {
    this.fizz = "buzz";
}

const foo = new Foo();
const bar = new Bar();

console.log(foo instanceof Foo);
console.log(bar instanceof Bar);