【问题标题】:Difference between object and object.prototype in Javascript [duplicate]Javascript中object和object.prototype之间的区别[重复]
【发布时间】:2017-03-24 09:13:14
【问题描述】:

好的,这是我正在使用 atm 的一些代码。

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

所以我的核心问题是:object的properties和object.prototype的properties有什么区别?

编辑:指定: 在内存功能中,我记录了 this.options。这不起作用,除非我包含 Memory.prototype.options = {...}。如果一个新的 Memory 继承了 Memory 的属性,并且我在上面定义了 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();

【问题讨论】:

  • 什么是extend
  • 这是在代码中进一步声明的函数,不用担心

标签: javascript object prototype


【解决方案1】:

您忘记在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();

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

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

相反,如果您有一个与所有实例完全相同的方法,那么您可以通过将其放入 Prototype 并简单地继承它来节省内存。

【讨论】:

  • 谢谢你,但是我的问题不是我的代码为什么工作/不工作,而是关于对象和原型的一般问题
  • 好的,这对我有帮助,比如说,75% 我现在还没有得到的是:当我创建一个新的内存 m 时,它会从原型中获取所有属性,对吗?但它不应该采用我在函数 Memory 中定义的所有属性吗? m毕竟是用内存的“计划”构建的
  • 它确实包含了您在Memory 中定义的所有元素。您始终可以覆盖特定实例上的原型属性。
  • 好的 80% 哈哈,我刚刚编辑了我的问题以指定
猜你喜欢
  • 1970-01-01
  • 2012-12-12
  • 2012-01-31
  • 2010-12-05
  • 2016-11-22
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
相关资源
最近更新 更多