2

我有两个 DIV 容器,每个容器都包含一个谜题(使用 jquery 可拖动实现)。

我还得到了一个对象,它看起来像:

var puzzle var puzzle = {
    option1 = [],
    init:function(container) { .... }
}

要开始我使用的一个 DIV 的拼图:

// left puzzle div
var puzzleLeft = puzzle;
puzzleLeft.init(leftContainer);

// right puzzle div
var puzzleRight = puzzle;
puzzleRight.init(leftContainer);

但是对于左边的它不起作用。我要做的一切都发生在右边:/当我取消注释右边的起始代码时,它将适用于左边:) 似乎右边的起始代码是错误的?这是创建 2 个拼图实例的错误方法吗?

谢谢马特

4

3 回答 3

2

原型继承

您的标题是“从 1 个对象创建 2 个实例”。上面写着原型继承。

您可以使用Object.create创建从另一个对象继承的对象。

// left puzzle div
var puzzleLeft = Object.create(puzzle);
puzzleLeft.init(leftContainer);

// right puzzle div
var puzzleRight = Object.create(puzzle);
puzzleRight.init(leftContainer);

但是,任何引用对象的属性都需要在您的init函数中设置。像这样的东西:

var puzzle = {

    // Let it be null for now
    option1: null,

    init: function(container) {
        // Set it to empty array inside init
        this.option1 = [ ];
    }

};

这将确保puzzleLeft并且puzzleRight正在使用不同的数组。


克隆

如果您使用像 jQuery 这样的库,另一种选择是简单地克隆对象。

// left puzzle div
var puzzleLeft = $.extend({ }, puzzle);
puzzleLeft.init(leftContainer);

// right puzzle div
var puzzleRight = $extend({ }, puzzle);
puzzleRight.init(leftContainer);

使用$.extend({ }, someObject)将制作someObject.

于 2012-11-23T14:01:19.253 回答
1

您可以创建类的构造函数而不是对象:

function Puzzle(){
   var self = this;

   self.option1 = [];
   self.init = function(container) { .... };
}

并创建它的两个实例:

// left puzzle div
var puzzleLeft = new Puzzle();
puzzleLeft.init(leftContainer);

// right puzzle div
var puzzleRight = new Puzzle();
puzzleRight.init(rightContainer);
于 2012-11-23T13:44:43.740 回答
0

实际上puzzleLeftpuzzleRight是相同的对象puzzle

您可以将拼图创建为

function puzzle(){
...
} 

并使用

new Puzzle()

或者使用 jquery 的 clone 函数来创建具有不同引用的对象的副本

于 2012-11-23T13:47:28.030 回答