当创建一个以OO方式使用JS的对象时,JS引擎之间是否有任何区别(除了能够定义构造函数:
var Uploader = Uploader || {};
和
var Uploader = function() {
}
和
function Uploader() {
}
特别是以后,你希望按照
的方式做点什么Uploader.DOM = {
Create: function(file) {
}
};
完全取决于个人喜好吗?或者有真正的区别吗?
答案 0 :(得分:1)
<强>物件:强>
var MyObj = {
myArr: [1,2,3],
find: function(/*some arguments*/) {
//some logic that finds something in this.myArr
}
}
在MyObj.find
函数中,this
关键字将指向MyObj
(这有点类似this
在具有类的语言中的工作方式)。您可以使用此功能执行混合:
var MyObj2 = {
myArr: [4,2,6]
}
MyObj2.find = MyObj.find;
在MyObj2.find
函数this
中,关键字将指向MyObj2
。
此外,对象支持getter和setter(适用于IE9 +和所有优秀的浏览器):
var MyObj = {
myArr: [1,2,3],
find: function(/*some arguments*/) {
//some logic that finds something in this.myArr
},
get maxValue() {
return Math.max.apply(null, this.myArr);// maxValue is calculated on the fly
},
a_: null,
get a () {
return this.a_;
},
set a (val) {
//fire a change event, do input validation
this.a_ = val;
}
}
现在可以像这样访问数组中的最大值:MyObj.maxValue
。我还添加了一个属性a_
。它的名称与getter和setter的名称不同,因此附加了下划线。附加或前置下划线是私有变量的命名约定,不应直接访问。
var qwe = MyObj.a // get a_
MyObj.a = 'something'; //set a_
<强>功能强>
var u = new Uploader(); // will throw an exception
var Uploader = function() { }
上传器在运行时定义。当我尝试实例化它时它还不存在。
var u = new Uploader(); //will work
function Uploader() {}
上传器在编译时定义,因此可以使用。
功能可以与揭示模式一起使用以隐藏某些成员。函数不支持getter和setter,但你可以将对象放在函数中。
function myFunc() {
function privateFunc() {};
function publicFunc() {};
var obj = {
//members, getters, setters
};
return {
publicFunc: publicFunc,
obj: obj
}
}
您可以在muFunc.publicFunc()
之外拨打myFunc
,因为它已被退回。但是你不能在外面使用privateFunc
,因为它不会被返回。
揭示模式函数通常不是要实例化的。这是因为当您实例化它时,内部的所有内容都将被复制到新实例中。因此,与使用prototype
添加函数相比,它会占用更多内存。
myFunc.prototype.someFunc = function() {};
与此类似,myFunc
的所有实例都会共享someFunc
的相同实例。
结论:使用函数可以模拟private
访问修饰符,但在对象中,this
关键字的行为与您在具有类的语言中所期望的有些相似。但是,您始终可以使用call
,apply
和bind
来更改该函数的上下文(即'this'关键字将是什么)。