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