2016-11-10 80 views
0

好的,这里有一些我正在使用atm的代码。Javascript中的对象和object.prototype之间的区别

我的问题是,我真的不明白对象和对象原型之间的差异。直到现在,我还以为,如果我创建一个新的对象,例如新的内存,这继承了我在内存中声明的所有属性。但是,在我的代码中,我需要为Memory.prototype添加选项。

所以我的核心问题是:是什么Object.prototype中的对象的属性和属性之间的区别?

编辑:在记忆功能中指定: 我登录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(); 
+0

什么是'extend'? –

+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();
对象的

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

例如,如果您有每个实例的ID号,那么ID属性需要位于Object上,因为它对于该实例是唯一的。相反,如果你有一个与所有实例完全相同的方法,那么你可以通过将它放入Prototype并简单地继承它来节省内存。

+0

感谢那 但是,我的问题不是为什么我的代码工作/不工作,而是一个关于对象和原型的一般问题 –

+0

好,帮助我,比如,75% 什么,我仍然不现在得到的是:当我创建一个新的存储器M,它需要所有属性从样机,对不对?但不应该采用我在函数Memory中定义的所有属性么? m是用内存的“计划”构建的,毕竟 –

+0

它确实使用了所有用“Memory”定义的元素。您始终可以覆盖特定实例的原型属性。 –

相关问题