Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 揭示原型';这';上下文_Javascript_Revealing Prototype - Fatal编程技术网

Javascript 揭示原型';这';上下文

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

我试图用下面的示例演示JSFIDLE中的原型模式;但是,警报始终显示“undefined”,而不是我在document ready上创建的对象实例中提供的值。我从提供的示例中获取了这一点,但似乎无法理解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
方法,只需使用不带
()
的函数名即可:

当您的
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();
});