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

DNB*_*ims 10 javascript

代码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)

编辑: 那么,伙计们,你的意思是第二个更好吗?或更"正式"?

CMS*_*CMS 8

基本上在第一个示例中,您声明了一个实际上已经是对象实例的对象文字.

在第二个示例中,您定义了一个构造函数,该函数可以与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)

您可以根据需要进一步操作,从先前定义的对象创建新实例.

推荐的 :


Sin*_*our 7

在第一个代码片段中,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)