Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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_Object_Prototype - Fatal编程技术网

对象内部的Javascript原型方法

对象内部的Javascript原型方法,javascript,object,prototype,Javascript,Object,Prototype,我试图创建一个包含其他对象和函数的对象,在原型中,相关部分是UI原型 var fChat = function() { this.debug = true; }; fChat.prototype = { constructor: fChat, Log: function(str){ if(this.debug){ console.log(str); } }, UI: { Login:

我试图创建一个包含其他对象和函数的对象,在原型中,相关部分是UI原型

var fChat = function() {
    this.debug = true;
};

fChat.prototype = {
    constructor: fChat,
    Log: function(str){
        if(this.debug){
            console.log(str);
        }
    },
    UI: {
        Login: {
            Show: function(){
                this.Log("UI.Login.Show()");
            }
        }           
    }
};

var fChatInstance = new fChat();
fChatInstance.UI.Login.Show();
当我调用
fChatInstance.UI.Login.Show()时,它会给我一个错误:
未捕获类型错误:此.Log不是函数

这是因为通过使用
这个
在另一个作用域上吗?

通常我做
var self=this在原型开始时,但我不知道如何使用对象原型来实现这一点。

是的。问题是这个的javascript动态绑定,要解决这个问题,可以使用bind函数将“this”设置为对象。更改fchat函数并按如下方式重构它:

var fChat = function() {
  this.debug = true;
  this.UI.Login.Show =  this.UI.Login.Show.bind(this);
  this.Log =  this.Log.bind(this);
};

这是对象
{Show:function(){/*…*/}}
。您可以通过在
Show
中调试并检查
this
或执行
console.log(this)来解决这个问题
Show
中这是一种有点奇怪的模式。所以每个
fChat
都有自己的
Log
UI
?似乎所有这些东西都应该抽象成自己的工作单元“类”@RGraham这是我第一次使用原型和“类”,所以我可能会用错误的方式来做。无论如何,我只初始化了fChat的一个实例。我同意@RGraham的观点,即最好将这个“类”拆分为多个类。例如,创建一个
登录
类,然后在构造函数中传入一个
记录器
类实例。现在,
fChat
类已经有了。请查看一些关于这方面的好信息。