Javascript OOP继承创建GLOBAL对象

标签 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 中调用一个新的异常。

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

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

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

但是... 当我创建一个新实例模型并向该实例添加错误时,类异常 显示为全局对象。看...

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 类的消息数组不是全局的?

最佳答案

问题出在您的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对象与异常原型(prototype)相关联。这意味着它在所有实例之间共享。现在这是一个非常简单的修复:只需将其放在启动中即可。

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 ?
    }
}

关于Javascript OOP继承创建GLOBAL对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26947904/

相关文章:

javascript - JS OOP 从构造函数调用方法

c++ - 如何在类声明中动态初始化变量,而不是常量

actionscript-3 - 如何访问 ActionScript 中的顶级包?

javascript - 从 AngularJS 中的 location.search 中删除项目

javascript - Jquery在jQuery错误中从缩略图放大图像

c# - new() 约束对类定义有何作用?

c - 我需要用 C 语言创建一个全局数组,其大小由用户输入

javascript - angularjs deferred 在回调中不起作用

javascript - Uncaught TypeError : rand. 切片不是函数

python - python中的exec()命令无法从函数内部更改全局变量