3

选项1:

<script>
var myObject = function(){  
    this.iAm = 'an object';  
    this.whatAmI = function(){  
        alert('I am ' + this.iAm);  
    };   
   } 
var myNewObject = new myObject();  
myNewObject.whatAmI(); 
</script>

选项 2:

<script>
function myObject(){  
    this.iAm = 'an object';  
    this.whatAmI = function(){  
        alert('I am ' + this.iAm);  
    };  
}; 
var myNewObject = new myObject();  
myNewObject.whatAmI(); 
</script>

问题:

这两个代码都可以工作。但是它们之间有什么区别呢?在进行OOP编码时,哪种方式更好js

4

3 回答 3

2

它们都被称为基于原型的编程。区别如下:第一个是字面表示法,第二个是构造函数。

字面符号

var myObject = {  

};  

构造函数

function myObject(){  
  
};  

用法上的差异

没有更好的方法取决于您如何使用它。

字面量是名称间距的首选选项,这样您的 JavaScript 代码就不会干扰(反之亦然)在页面上运行的其他脚本,并且如果您将此对象用作单个对象并且不需要多个对象,而如果您需要在创建对象之前做一些初始工作或需要对象的多个实例,其中每个实例都可以在脚本的生命周期内更改,则首选构造函数类型表示法。

  • 构造函数对象的属性和方法在其前面使用关键字“this”定义,而文字版本则没有。

  • 在构造函数对象中,属性/方法的“值”定义在等号“=”之后,而在文字版本中,它们定义在冒号“:”之后。

  • 构造函数可以有(可选的)分号';' 在
    每个属性/方法声明的末尾,而在文字
    版本中,如果您有多个属性或方法,它们必须
    用逗号','分隔,并且它们后面不能有分号
    ,否则 JavaScript 将返回错误。

于 2013-06-13T08:43:20.800 回答
1

第一个例子不会被提升。在您的第二个示例中,该功能将被提升。

在您的示例中,使用选项 1(未提升):

如果您调用此代码:

var myNewObject = new myObject();  
myNewObject.whatAmI();

在函数声明之前,您会收到一个错误。但是,在您的第二个示例中,该函数被移动到封闭范围的顶部,声明并准备好使用(提升)。

http://www.sitepoint.com/back-to-basics-javascript-hoisting/

于 2013-06-13T08:42:18.023 回答
1

第一个符号将创建一个具有名称的变量,myObject并为该变量分配一个匿名(无名)函数:

var myObject = function(){  
};

第二种表示法将创建一个名为 的函数myObject

function myObject() {
}

name您可以通过访问属性来绘制函数的名称:

console.log(myObject.name);
//will print an empty string for the first example
//but "myObject" for the second example

吊装也有区别。在第一个示例中,只有变量声明会被提升,但函数定义不会。在第二个示例中,完整的函数将被提升到当前范围的顶部。

console.log(ad()); //ad
console.log(ac()); //will throw an error because ac is undefined

function ad(){
    return "ad";
}

var ac = function(){
    return "ac";
}
于 2013-06-13T09:01:56.410 回答