对于可能具有误导性的标题感到抱歉,但我想知道为什么这种创建对象并添加属性和方法的方法:
//A)
var myObjCreatedByFunction = function() {
this.prop1 = "a";
this.func1 = function() {
alert("a");
}
};
然后使用原型创建其他方法
myObjCreatedByFunction.prototype.func2 = function() { ... }
优于简单和普通的创建对象:
//B)
var myObj = {
prop1: "a",
func1: function() {
alert("a");
}
};
只需按
添加新方法myObj.func2 = function() { ... }
因为我看到一些熟练的开发人员使用第一种方法并使用原型,即使他们以后从未创建新实例。
此外,IIFE的使用是否优于两个例子,如果是,为什么? (我最近看到很多用法)
var myObjIIFE = (function() {
return {
prop1: "a",
func1: function() {
alert("a");
}
}
})());
有人可以解释我应该何时使用第一种方法,第二种和第三种方法以及为什么?谢谢!
答案 0 :(得分:2)
B仅对单个实例有用。它没有提供使用像A这样的方法和属性创建该类型的多个实例的方法。如果您想要/需要的只是一个实例,那么B就可以了,也许更容易表达和遵循。
关于是否将原型用于方法或在构造函数中分配它们,有很长的讨论(参见prior reference,还有许多其他此类讨论)。使用原型然后使用new
运算符创建新对象将节省内存(因为所有实例都共享所有方法)。在构造函数中分配它们允许访问私有实例变量(构造函数中的局部变量),并且在执行给定方法时性能稍好。
IIFE是一些人选择采用的模式。它对您正在做的事情没有任何好处,但确实提供了存储"私有类变量的范围"它们由所有实例共享,但外部世界无法访问。你展示它的方式,不是我最喜欢的,因为对象上没有类型信息。它只是一个具有属性的普通对象。在某些情况下(特别是在调试中,有时在编码中),了解您拥有的对象类型会很有用。