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

时间:2013-08-06 11:27:19

标签: javascript class oop

我是javascript中对象的新手。在https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript上阅读这个主题,并有点困惑。

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

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

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

    这与代码兼容性方面的函数定义完全不同......

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

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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

答案 2 :(得分:1)

这两者并不等同。第一个版本创建一个对象,其中设置了属性namepassword。第二个版本创建一个尚未执行的函数;在调用new User之前没有设置属性。