2010-09-15 80 views
1

我已经适应了Crockford的对象()函数,这样我可以在传递一些参数和自动运行在新对象的初始化函数:属性附加到错误的对象

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()调用它,则停止。

任何人都可以解释为什么会发生这种情况?

回答

2

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

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

只要知道JavaScript与您可能已使用的其他OO语言的行为不完全相同,并且这些类以及私有和公共概念(以及其他语言特性)都有点瑕疵。

+0

为什么它在这个特定的实例中没有上下文?我确定我已经在一个班级里面调用了函数,而不使用“this”。过去很多次没有得到这个问题。是因为我从原型中获得build()“二手牌”,而不是将它用在最初定义的对象中?这是否意味着我将不得不为每个函数使用.call,或者在从原型继承时使它们全部公开? – wheresrhys 2010-09-15 16:08:52

+1

@ wheresrhys:您不必为每个私人会员电话使用'call'或'apply'。这意味着你不能在没有这些私有方法的情况下使用'this'。 – palswim 2010-09-15 17:31:07