JS中这两种编码风格有什么区别?

时间:2013-06-13 08:39:28

标签: javascript oop

选项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编码时,哪种方式更好?

3 个答案:

答案 0 :(得分:2)

它们都被称为基于原型的编程。区别在于: 第一个是Literal表示法,第二个是Constructor函数。

文字符号

var myObject = {  

};  

构造函数

function myObject(){  
  
};  

使用差异

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

Literal是名称间距的首选选项,因此您的JavaScript 代码不会干扰(或反之亦然)与运行在其上的其他脚本 页面以及如果您将此对象用作单个对象而不需要 该对象的多个实例,而Constructor函数类型 如果您需要在对象之前执行一些初始工作,则首选符号 是创建或需要每个实例的对象的多个实例 可以在脚本的生命周期内更改。

  • 构造函数对象的属性和方法定义为 关键字'this'在它前面,而文字版本 不

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

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

答案 1 :(得分:1)

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

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

如果您调用此代码:

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

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

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

答案 2 :(得分: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";
}
相关问题