我已经改编了Crockford object()函数,以便我可以传入一些参数并在新对象中自动运行init函数:
function object(o) {
function F() {}
F.prototype = o;
var params = Array.prototype.slice.call(arguments,1);
var obj = new F();
if(params.length) {
obj.init.apply(obj,params);
}
return obj;
}
大部分时间都可以正常工作,但在一个对象中,我的函数定义如下:
MY.Object = function() {
function init(element, generator) {
build(element);
// more code after
}
function build(element) {
this._property = "example";
}
return {
init: init;
}
}();
如果我再运行
My.Object2 = object(MY.Object, "test param");
由于某种原因,_property被添加到Windows对象中。如果我构建一个公共方法并使用this.build()调用它,则会停止。
有人可以解释为什么会这样吗?
答案 0 :(得分:2)
build
,虽然你已经在你的班级中定义了它,但是当你调用它时没有上下文。因此,没有上下文意味着this
引用了您的window
对象(至少在浏览器中)。但是,即使您没有正确的this
上下文,您仍然可以访问您在类的“私有”范围内声明的变量。
尝试使用build.call(this, element)
(function.call
与function.apply
类似)。
要知道JavaScript的行为方式与您可能使用过的其他OO语言的行为方式不同,而且这些类以及私有和公共(以及其他语言功能)的概念都是一种黑客行为。