Javascript 揭示原型';这';上下文
我试图用下面的示例演示JSFIDLE中的原型模式;但是,警报始终显示“undefined”,而不是我在document ready上创建的对象实例中提供的值。我从提供的示例中获取了这一点,但似乎无法理解id值未定义的原因。我认为这与“这个”的变化背景有关,但不确定如何变化?谢谢Javascript 揭示原型';这';上下文,javascript,revealing-prototype,Javascript,Revealing Prototype,我试图用下面的示例演示JSFIDLE中的原型模式;但是,警报始终显示“undefined”,而不是我在document ready上创建的对象实例中提供的值。我从提供的示例中获取了这一点,但似乎无法理解id值未定义的原因。我认为这与“这个”的变化背景有关,但不确定如何变化?谢谢 foo = window.foo || {} foo.User = function(id){ this.id = id; this.name = "Bob"; }; foo.User.proto
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
方法,只需使用不带()
的函数名即可:
当您的newUser.showUser()调用它时代码>行,在调用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 foo;
foo = foo || {};
如果已经有一个声明的变量名为foo
,则var foo
位为no op;它绝对没有影响(尤其是对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();
});
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();
});