揭示原型'这个'上下文

时间:2014-08-17 16:13:57

标签: javascript revealing-prototype

我正在尝试使用下面的示例演示jsfiddle中的Revealing Prototype Pattern;但是,警报始终显示“未定义”,而不是我在文档就绪时创建的对象实例中提供的值。我从Dan Wahlin's blog提供的示例中获取了这个,但似乎无法弄清楚为什么id的值未定义。我认为它与“这个”变化的背景有关,但不确定如何?感谢。

foo = window.foo || {}
foo.User = function(id){
    this.id = id;
    this.name = "Bob";    
};
foo.User.prototype = function(){
    var showUser = function(thisObj){alert(thisObj.id);};
    var showUserPublic = function(){showUser(this);};
    return{
            showUser : showUserPublic()   
    };
}();



$(function(){
    var newUser = new foo.User("bob123");
    newUser.showUser();
});

1 个答案:

答案 0 :(得分:2)

showUser : showUserPublic() 调用 showUserPublic并将其返回值(undefined)分配给属性showUser。如果您希望在原型上公开showUserPublic作为showUser方法,只需使用不带()的函数名称:

return{
        showUser : showUserPublic
};

newUser.showUser();行呼叫时,this将成为调用showUserPublic期间的用户对象,并将其作为参数传递给showUser。 (我不知道你为什么间接这样做,但我希望你确实有理由。)


旁注:

我建议替换默认的prototype对象,而是扩充它。这避免了与时间相关的陷阱。这是一个很小的变化:

(function(p){
    var showUser = function(thisObj){alert(thisObj.id);};
    p.showUser = function(){showUser(this);};
}(foo.User.prototype);

旁注2:

另外,代码似乎依赖The Horror of Implicit Globals而未声明foo。您可以将第一行更改为:

var foo = foo || {};

如何运作:

由于Poor, misunderstood var,这真的归结为:

var foo;
foo = foo || {};

如果已经有一个名为foo的声明变量,则var foo位为无操作;它绝对没有效果(特别是对foo的当前值没有影响)。然后下一行很简单:如果foo为假,我们会为其分配{}


将旁注与主答案放在一起:

var foo = foo || {}
foo.User = function(id){
    this.id = id;
    this.name = "Bob";    
};
(function(p){
    var showUser = function(thisObj){alert(thisObj.id);};
    p.showUser = function(){showUser(this);};
}(foo.User.prototype);


$(function(){
    var newUser = new foo.User("bob123");
    newUser.showUser();
});