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

时间:2009-08-08 06:38:49

标签: javascript

代码1:

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

代码2:

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

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

修改 所以,伙计们,你的意思是第二个更好吗?或更“正式”?

3 个答案:

答案 0 :(得分:8)

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

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

对象文字也可用于创建对象的新实例并进行原型继承,Douglas Crockford也提倡这种技术。

基本上您可以拥有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();

您可以根据需要继续前进,从之前定义的对象中创建新实例。

推荐:

答案 1 :(得分:7)

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

var o = new Something();

这种创造物体的形式非常适合单身人士;你只需要一个实例的对象。

第二个代码段中,Something是一个构造函数,您可以使用new关键字。

修改

此外,在您的第二个代码段中,由于您使用Something.name而不是this.name,因此它将始终提醒构造函数本身的名称,即“Something”,除非用Something.name = "Cool";之类的内容覆盖该属性。

您可能希望该行说:

alert(this.name);

答案 2 :(得分:1)

在第一个示例中,您可以执行

Something.sayHi();

而在第二个你必须这样做

new Something().sayHi();