Javascript 对象定义有两种方式-区别是什么?

Javascript 对象定义有两种方式-区别是什么?,javascript,class,oop,Javascript,Class,Oop,我不熟悉javascript中的对象。读了关于这个主题的文章,我有点困惑 我不理解函数和对象之间的区别。一方面,函数应该是函数的实例(它是对象的子对象),因此函数也应该是对象 另一方面,对象本身表示为键值对,例如: var User={name:“Tomy”,password:“secret”} 这与函数定义在代码兼容性方面有很大的不同 我可以用两种不同的方法创建函数吗 var User=function(){this.name=“Tomy”;this.password=“secret”} 第一

我不熟悉javascript中的对象。读了关于这个主题的文章,我有点困惑

我不理解函数和对象之间的区别。一方面,函数应该是函数的实例(它是对象的子对象),因此函数也应该是对象

另一方面,对象本身表示为键值对,例如:

  • var User={name:“Tomy”,password:“secret”}

    这与函数定义在代码兼容性方面有很大的不同

    我可以用两种不同的方法创建函数吗

  • var User=function(){this.name=“Tomy”;this.password=“secret”}


  • 第一种方法创建具有两个属性的对象实例。您可以这样访问它们:

    User.name; // Tomy
    User.password; // secret
    
    第二种方法创建对象的定义,您可以创建对象的单独实例,这些实例将具有其属性的单独实例。例如:

    var a = new User();
    a.name; // Tomy
    a.password; // secret
    var b = new User();
    b.name = "Ralph";
    a.name; // Tomy
    b.name; // Ralph
    

    这两者并不完全相同。第一个版本创建了一个对象,其属性设置为
    name
    password
    。第二个版本创建了一个尚未执行的函数;在调用新用户之前,不会设置任何属性。

    在本例中,
    User
    现在保存一个对象

    var User = {name:"Tomy", password:"secret"}
    typeof User === "object"
    User.name === "Tomy"
    

    在本例中,
    User
    将持有一个函数。此函数可用于创建对象

    var User = function () {this.name="Tomy"; this.password="secret";}
    typeof User === "function"
    User.name === undefined
    
    然后,您可以创建任意数量的用户

    var user1 = new User(), user2 = new User();
    user1.name === "Tomy"
    

    一个更现实的例子是:

    var User = function (name, pass) {this.name=name; this.password=pass;}
    
    var john = new User("John", "secret")
    var andrew = new User("Andrew", "passw0rd")
    
    john.password === "secret"
    
    通常,构造函数(生成对象的函数)比对象文本更灵活,并允许方便且一致地创建对象(bug更容易发现,重复代码更少)

    这两种方法中没有跨浏览器的不一致



    要了解是什么以及在“创建时刻”有效地发生了什么,请参见和

    With B u can do
    var tomy=new User()和对象是用于保存…数据的数据结构。函数是可重用的命令集合。可以使用函数作为构造函数来创建对象。对象文字和构造函数是创建对象的两种方法,只是您必须显式调用构造函数来创建对象。@更准确地说,版本B有一个原型(在每个新实例上克隆的一组属性),而版本a没有。编辑:让我想,如果你向匿名对象添加原型属性,你可以使用new和吗?@Virus721:你只能对函数使用
    new
    。这与
    原型
    属性无关。好的,最后一个问题是关于对象的“创建时刻;”-)。当我使用var john=newuser(“john”,“secret”)时,到底会发生什么?我的猜测是:1)新对象被创建。2) 这与新创建的对象绑定。3) 函数被调用。(因此在调用this.something时创建数据成员)。我答对了吗?@Novellizator,我在回答的最后加了一个解释。@FakeRainBrigand:没有,没有复制任何东西。并且新对象不等同于
    {}
    (除非
    User.prototype
    null
    )。有关正确的步骤,请参阅。@Bergi,我编辑了我的答案。这样更好吗?如果我弄错了什么,请随意进一步编辑以确保正确性。不,没有更好的。因为我不想复制所有内容,所以我只是将相关的SO问题链接起来。