附加到错误对象的属性

时间:2010-09-15 15:59:05

标签: javascript inheritance prototype

我已经改编了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()调用它,则会停止。

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

build,虽然你已经在你的班级中定义了它,但是当你调用它时没有上下文。因此,没有上下文意味着this引用了您的window对象(至少在浏览器中)。但是,即使您没有正确的this上下文,您仍然可以访问您在类的“私有”范围内声明的变量。

尝试使用build.call(this, element)function.callfunction.apply类似)。

要知道JavaScript的行为方式与您可能使用过的其他OO语言的行为方式不同,而且这些类以及私有和公共(以及其他语言功能)的概念都是一种黑客行为。