【问题标题】:JavaScript prototype structure and objectsJavaScript 原型结构和对象
【发布时间】:2012-10-10 16:30:53
【问题描述】:

我是原型结构的新手,我无法弄清楚这个结构。这是我的 JavaScript 代码。

var Game = function ()
{
   //some variables
};
Game.prototype.block = 
{
    spawn: function () {
        var t1 = new this.inst;
    },
    inst : {
        x: 5,
        y: 0,
        type: ''
    }
};

当我尝试创建一个新对象“inst”时,我收到以下错误: 类型错误:对象不是函数。我做错了什么?

【问题讨论】:

  • 您的代码异常。你如何创建一个新的inst 对象?我看到的唯一inst 已经是Game.prototype.block 上的一个对象。 new this.inst 永远不会工作,因为 inst 不是一个函数。
  • 假设我是大多数 JavaScript 和原型的完全菜鸟。我应该如何重组我的代码以使其有意义?
  • 你想最终完成什么?
  • 这是大量代码的简短摘录。我在“setInterval”中调用 spawn,我想创建一个“inst 对象”的新实例并操作它的属性。
  • 如果你想创建继承自inst对象的对象,你可以使用Object.create来实现,所以你可以使用var t1 = Object.create(this.inst);,假设你正在做类似var game = new Game(); game.block.spawn();的事情

标签: javascript object prototype typeerror


【解决方案1】:

如果您想创建从inst 对象继承的对象,您可以使用Object.createvar t1 = Object.create(this.inst); 来实现。

var Game = function () {
   //some variables
};
Game.prototype.block =  {
    spawn: function () {
        var t1 = Object.create(this.inst);
    },
    inst : {
        x: 5,
        y: 0,
        type: ''
    }
};

那么你的代码看起来像这样;

var game = new Game();

game.block.spawn();

.spawn() 方法将有一个变量引用从Game.prototype.block.inst 对象继承的对象。

【讨论】:

    【解决方案2】:

    首先,inst 没有定义在Game 的范围内。因此,引用Gamethis 没有任何名为inst 的属性。其次,inst 后面必须跟 () 表示对构造函数的调用,您在此处缺少它。

    【讨论】:

    • 当您使用new 时,您不需要() 来调用函数,但我看不出OP 的this 如何引用Game。充其量可以参考Game.prototype.block
    • 这是因为Game.prototype.block 不是实例属性,而是已经实例化的单例对象。不过我可能错了。
    • 如何通过原型使用嵌套函数并且仍然可以在游戏范围内访问它们?
    【解决方案3】:

    您需要一个静态工厂方法来创建新的“inst”。下面的代码是你需要的吗?你调用Game.spawn方法生成一个新的inst,你可以把这个方法放在setInterval中。

    function Game() {
        //some variables
    }
    
    Game.spawn = function() {
        function Inst() {
            this.x = 5;
            this.y = 0;
            this.type = '';
        }
    
        return new Inst;
    }
    
    var inst1 = Game.spawn();
    inst1.x = 1; //test inst1
    console.log(inst1.x);
    var inst2 = Game.spawn();
    inst2.x = 2; //test inst2
    console.log(inst2.x);
    var inst3 = Game.spawn();
    inst3.x = 3; //test inst 3
    console.log(inst3.x);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多