2013-08-06 44 views
8

我是新来javascript中的对象。阅读关于https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript的这个话题,并且有些困惑。2种方式的对象定义 - 有什么区别?

我不明白功能和对象之间的区别。一方面,函数应该是函数的实例(它是Object的子元素),所以函数也应该是Object。

在另一方面对象本身被表示为一个键 - 值对,如:

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

    ,这是从一个函数定义在码相容性方面相当不同..

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

  2. var User = function() {this.name="Tomy"; this.password="secret";}

+2

用b u能做到'无功TOMY =新用户();' – DarkBee

+2

和目标是一个数据结构来保存...数据。一个函数是一个可重用的命令集合。您可以使用函数作为*构造函数*来创建对象。对象文字和构造函数是创建对象的两种方式,只有你必须显式调用构造函数来创建对象。 –

+0

@DarkBee更准确地说,版本B有一个原型(在每个新实例上克隆的一组属性),而A没有。编辑:让我觉得,如果你添加一个原型属性到匿名对象,你可以使用新的A? – Virus721

回答

7

在此示例中,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" 

一般构造(功能,使物体)比对象文本更灵活,允许方便和一致的创建对象(错误更容易发现,重复代码更少)。

这两种方法没有跨浏览器不一致的情况。


要明白什么new keyword是在“创造的时刻”真正发生的事,见What is the 'new' keyword in JavaScript?How does the new operator work in JavaScript?

+0

好的,关于对象的“创建时刻”的最后一个问题;-)。当我做var john = new User(“John”,“secret”)时,究竟发生了什么?我的猜测是这样的:1)创建新对象。 2)这与新创建的对象绑定在一起。 3)函数被调用。 (并且在调用this.something时创建数据成员)。我是否正确? – Novellizator

+0

@Novellizator,我在答案的最后添加了一个解释。 – FakeRainBrigand

+0

@FakeRainBrigand:不,不会复制任何内容。新对象不等于'{}'(除非'User.prototype'为'null')。请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new了解正确的步骤。 – Bergi

2

第一种创建具有两个属性的对象的实例。你可以像这样访问他们:

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 
1

这两个不是等价的。第一个版本创建一个对象,设置属性namepassword。第二个版本创建一个尚未执行的功能;在调用new User之前没有设置属性。

相关问题