代码1:
var Something = {
name: "Name",
sayHi: function(){
alert(Something.name);
}
}
Run Code Online (Sandbox Code Playgroud)
代码2:
function Something(){
this.name = "Name";
}
Something.prototype.sayHi = function(){
alert(Something.name);
}
Run Code Online (Sandbox Code Playgroud)
编辑: 那么,伙计们,你的意思是第二个更好吗?或更"正式"?
基本上在第一个示例中,您声明了一个实际上已经是对象实例的对象文字.
在第二个示例中,您定义了一个构造函数,该函数可以与new运算符一起使用以创建对象实例.
对象文字也可用于创建对象的新实例并进行原型继承,Douglas Crockford也提倡这种技术.
基本上你可以有一个object运营商:
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
Run Code Online (Sandbox Code Playgroud)
这种辅助功能可以非常直观和方便的方式使用.
它基本上接收一个对象作为参数,在函数内创建一个新的对象实例,旧对象被链接到新对象的原型,并返回它.
它可以像这样使用:
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();
Run Code Online (Sandbox Code Playgroud)
您可以根据需要进一步操作,从先前定义的对象创建新实例.
推荐的 :
在第一个代码片段中,Something是一个简单的对象,而不是构造函数.特别是,你不能打电话:
var o = new Something();
Run Code Online (Sandbox Code Playgroud)
这种创造物体的形式非常适合单身人士; 您只需要一个实例的对象.
在第二个片段中,Something是构造函数,您可以使用该new关键字.
编辑:
另外,在你的第二个片段中,由于你使用的Something.name是相反的this.name,它将始终提醒构造函数本身的名称,即"Something",除非你用类似的东西覆盖该属性Something.name = "Cool";.
你可能想要那条线说:
alert(this.name);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |