代码1:
var Something = {
name: "Name",
sayHi: function(){
alert(Something.name);
}
}
代码2:
function Something(){
this.name = "Name";
}
Something.prototype.sayHi = function(){
alert(Something.name);
}
修改 所以,伙计们,你的意思是第二个更好吗?或更“正式”?
答案 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();