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