我正在尝试使用下面的示例演示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();
});
答案 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();
});