Javascript OOP继承创建GLOBAL对象

时间:2014-11-15 16:20:16

标签: javascript oop global extend

看那个。

// @alias ActiveRecord.extend
...
extend: function extend(destination, source){
   for (var property in source){
       destination[property] = source[property];
   }
   return destination;
}
...

我有这堂课:

function Exception(){}
Exception.prototype = {
    messages: {},
    add: function(k, v){
          if(!Array.isArray(this.messages[k])) this.messages[k] = new Array
          this.messages[k].push(v)
    }
}

而且,我有这门课。并且它调用方法this.errors一个新的Exception。

function Validations(){
   this.errors = new Exception
}

而且,我创建了这个模型,模型有验证,验证有错误,很好。

ActiveSupport.extend(Model.prototype, Validations.prototype)
function Model(){};

但是... 当我创建一个新实例模型并向该实例添加错误时,Class Exception 作为全球对象出现。 LOOK ...

a = new Model
a.errors.add('a', 1);
console.log(a.errors.messages) // return {a: [1]}

b = new Model
b.errors.add('a', 2);
console.log(b.errors.messages) // return {a: [1,2]}

我该如何解决这个问题?

如何使类Exception的消息数组不是GLOBAL?

1 个答案:

答案 0 :(得分:1)

问题在于你的Exception课程:

function Exception(){}
Exception.prototype = {
    messages: {},
    add: function(k, v){
          if(!Array.isArray(this.m[k])) this.m[k] = new Array
          this.m[k].push(v)
          // did you mean this.messages ?
    }
}

我认为this.mthis.messages应该是同一个东西,所以我会把它视为它是怎么回事。


您的messages对象与Exception原型相关联。这意味着它在所有实例中共享。它现在是一个非常简单的解决方案:只需将其置于启动状态。

function Exception(){
    this.messages = {};
}
Exception.prototype = {
    add: function(k, v){
          if(!Array.isArray(this.m[k])) this.m[k] = new Array
          this.m[k].push(v)
          // did you mean this.messages ?
    }
}