Javascript

时间:2016-11-10 11:00:23

标签: javascript object prototype

好的,所以这里有一些我正在使用atm的代码。

我的问题是我并没有真正区分对象和对象原型。到目前为止,我想,如果我制作一个新的对象,例如new Memory,它继承了我在Memory中声明的所有属性。但是,在我的代码中,我需要向Memory.prototype添加选项。

所以我的核心问题是:对象的属性与object.prototype的属性有什么区别?

编辑:指定: 在Memory函数中我记录this.options。除非我包含Memory.prototype.options = {...},否则这不起作用。如果新内存继承了内存中的属性,我在上面定义了例如this.options.availableCards,为什么我需要在原型中添加选项?

var createMemory = function (){
        new Memory( {wrapperID: 'memory-game'} );
      };

      var Memory = function (options) {
        //check for required options
        if ((options.wrapperID === undefined)){
          console.error('ERROR: not all required options given. wrapperID is required!');
          return false;
        }

        //hardcoded values
        this.options.availableCards = 22;
        this.options.cols = 4;
        this.options.rows = 4;
        this.options.fliptime = this.options.flipTime || 1; //set default
        this.options = extend({}, this.options);
        extend(this.options, options);
        //this._init();
        console.log(this.options);

      };

       // why is this required?
       Memory.prototype.options = {
         onGameEnd: function(){
           return false;
         }
       };

       createMemory();

1 个答案:

答案 0 :(得分:0)

您忘记在createMemory中返回新对象。

还有一些其他修复,我必须发明一个extend函数,因为你没有包含你的函数。



//Extend function
function extend(a, b) {
    for (var i in b) {
      if (b.hasOwnProperty(i)) {
        a[i] = b[i];
      }
    }
    return a;
  }
  //Memory class

function Memory(options) {
  //check for required options
  if ((options.wrapperID === undefined)) {
    console.error('ERROR: not all requried options given. wrapperID is requried!');
    return false;
  } // hardcoded values

  this.options.availableCards = 22;
  this.options.cols = 4;
  this.options.rows = 4;
  this.options.flipTime = this.options.flipTime || 1;
  this.options = extend({}, this.options);
  extend(this.options, options);
  //this._init();
};
Memory.prototype.options = {
  onGameEnd: function() {
    alert("Inherited")
  }
};
//Instantiater
function createMemory() {
  return new Memory({
    wrapperID: 'memory-game'
  });
};

//Instantiate
var m = new createMemory();
//Call inherited
console.log(m);
m.options.onGameEnd();




Object的属性特定于该对象的实例,而Prototype的属性在该对象的实例之间共享。

例如,如果您有每个实例的ID号,那么ID属性需要在Object上,因为它对该实例是唯一的。

相反,如果你的方法与所有实例完全相同,那么你可以通过将它放在Prototype中来保存内存,然后继承它。