使用命名空间将原型对象分配给对象中的匿名函数,这是未定义的?

时间:2013-07-02 00:01:13

标签: javascript namespaces scope prototype

我尝试使用以下命令在命名空间内分配原型(所有内容都包含在全局对象中):

prototypeObjects:{

        Person : function(config){

            var that = this;

            this.name = config.name;
            this.age = config.age;

            console.log(that);

            that.prototype.working = function(){

                console.log(this.name + 'is working');

            };

    },

},

然后我在控制台中使用它来检查它:

var me = new global.prototypeObjects.Person({name:' Mike',age:' 40'});

给出了这个错误:

TypeError:无法设置属性' working'未定义的

但是,如果我明确指定原型,即:

prototypeObjects:{

        Person : function(config){

            var that = this;

            this.name = config.name;
            this.age = config.age;

            console.log(that);

            **global.prototypeObjects.Person**.prototype.working = function(){

                console.log(this.name + 'is working');

            };

        }



    },

然后它按预期工作,我得到以下内容:

global.prototypeObjects.Person {name:" Mike",age:" 40",working:function}

和me.working()退出'迈克正在工作'

有人可以解释为什么我不能使用这个'在这种情况下?

2 个答案:

答案 0 :(得分:1)

您可以在构造函数体中定义原型函数,您应该在函数体外定义原型函数:

var global={};
global.pototypeObjects= {
   Person : function(config){
     this.name = config.name;
     this.age = config.age;
   }
};
global.pototypeObjects.Person.prototype.working=function(){
  console.log(this.name + " is working");
};
var p = new global.pototypeObjects.Person(
  {name:"jon",age:22}
);
p.working();//jon is working

以下是有关原型和设置继承的一些基本说明:Prototypical inheritance - writing up

最好不要在构造函数中使用var,因为它们会创建闭包,这些对象需要更多的cpu来初始化和更多的内存。

答案 1 :(得分:0)

因为您已经实例化了该对象。 prototype存在于类中,而不是对象上。你可以这么做:

this.working = function() {}

否则,您应该将它移到构造函数之外。