我正在尝试通过下面的示例在jsfiddle中演示“揭示原型模式”;但是,警报始终显示“未定义”,而不是我在准备好文档时创建的对象实例中提供的值。我从Dan Wahlin的博客提供的示例中获取了此信息,但似乎无法弄清为什么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();
});
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:
另外,代码似乎没有声明,而是依赖于《隐式全球性恐怖》foo
。您可以将第一行更改为:
var foo = foo || {};
工作原理:
由于可怜,被误解了var
,实际上可以归结为:
var foo;
foo = foo || {};
如果已经有一个声明的变量称为foo
,则该var foo
位为无操作;否则为0。它绝对没有影响(特别是对的当前值没有影响foo
)。然后,下一行很简单:如果foo
为false,{}
则将其分配给它。
将旁注与主要答案放在一起:
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();
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句