2009-08-08 72 views
10

代码1:这两个代码示例有什么区别?

var Something = { 
name: "Name", 
    sayHi: function(){ 
    alert(Something.name); 
    } 
} 

代码2:

function Something(){ 
    this.name = "Name"; 
} 

Something.prototype.sayHi = function(){ 
    alert(Something.name); 
} 

编辑: 所以,小伙子们,你的意思是第二个是更好?或更“正式”?

+0

这对我来说也是一个很好的问题,感谢张贴。 – 2009-08-08 07:02:37

+0

关于编辑中的问题,取决于你想要做什么。如果您只有对象的一个​​副本,请使用第一种语法。如果想要创建多个副本(比如'Something'是其他语言的'Class'),可以使用第二种语法(或者实际上是一个编辑过的版本,在其中使用'this.sayHi =函数(){...}',这是常态)。 – 2009-08-08 07:07:49

回答

8

基本上在第一个例子中,你声明了一个object literal,它实际上已经是一个对象实例。

在第二个示例中,您可以定义一个构造函数,该函数可以与new运算符一起使用来创建对象实例。

对象文字也可以用来创建对象的新实例并做原型继承,道格拉斯克罗克福德也提倡这种技术。

基本上你可以有一个object操作:

function object(o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
} 

这个辅助功能可以在一个非常直观和方便的方式使用。

它主要接收对象作为参数,将创建一个新的对象实例功能里面,旧的对象是新对象的原型,它的返回。

它可以像这样使用:

var oldObject = { 
    firstMethod: function() { alert('first'); }, 
    secondMethod: function() { alert('second'); }, 
}; 

var newObject = object(oldObject); 
newObject.thirdMethod = function() { alert('third'); }; 

var otherObject = object(newObject); 
otherObject.firstMethod(); 

你可以走得更远,只要你想,从之前定义的对象作出新的实例。

推荐:

+0

使用'Object(Something)'与使用'new'关键字不一样。特别是,如果您在第一种情况下更改任何财产,它将在全球范围内更改。例如'Object(Something).name =“new name”'将其改变为Something本身,而'(new Something())。name =“new name”'只会改变该特定的_instance_。 – 2009-08-08 07:03:50

+0

是的,对不起,我在想这篇文章中描述的'object'操作符... http://javascript.crockford.com/prototypal.html – CMS 2009-08-08 07:28:02

+0

@Sinan,大量编辑...... 24小时没有睡觉: - )... – CMS 2009-08-08 07:49:31

7

第一个代码片段Something是一个简单的对象,而不是一个构造函数。特别是,你不能打电话:

var o = new Something(); 

这种形式的创建对象是完美的单身;你只需要一个实例的对象。

第二片断,Something是一个构造函数,您可以使用关键字new它。

编辑:

而且,在你的第二个片段,因为你正在使用Something.name而不是this.name,它总是会提醒构造本身,这是“东西”的名字,除非你用类似于Something.name = "Cool";的东西覆盖该属性。

你可能希望该行说:

alert(this.name); 
1

在第一个例子中,你可以做

Something.sayHi(); 

,而在第二个你必须这样做

new Something().sayHi();