2016-02-25 48 views
1

我有一个解析关键字的特定对象属性的脚本,然后将这些关键字和另一个属性追加到对象中。新的属性值将打印到文档以进行错误检查。使用类/构造函数与变量方法时的不同作用域

var chemistry = { 
    field: "chemistry", 
    keywords: [ 
     "atom", 
     "proton", 
     "electron", 
     "wavefunction", 
     "neutron", 
     "catalyst"], 
    filter: function(title) { 
      var i; 
      for(i = 0 ; i < title.split(" ").length; i++) { 
      var title_part = title.toLowerCase().split(" ")[ i ]; 
      var j;      
       for(j = 0 ; j < this.keywords.length; j++) { 
        if (this.keywords[ j ] == title_part && library[ 0 ].keywords.indexOf(this.keywords[ j ]) == -1) { 
         library[ 0 ].keywords.push(this.keywords[ j ]); 
         if (library[ 0 ].field.indexOf(this.field) == -1) { 
          library[ 0 ].field.push(this.field); 
         }; 
        }; 
       }; 
      }; 
     } 
    }; 

chemistry.filter(library[0].title); 

document.writeln("KEYWORDS: " + library[0].keywords); 
document.writeln("FIELD: " + library[0].field); 

这工作正常,但我想创建一个类,它构造一个新的对象,如上所示。下面是我使用

"use strict"   
class Discipline { 
    constructor(field, keyword) { 
     this.field = field; 
     this.keywords = keyword; 
     this.filter = function(title) { 
      var i; 
      for(i = 0 ; i < title.split(" ").length; i++) { 
      var title_part = title.toLowerCase().split(" ")[ i ]; 
      var j;      
       for(j = 0 ; j < this.keywords.length; j++) { 
        if (this.keywords[ j ] == title_part && library[ 0 ].keywords.indexOf(this.keywords[ j ]) == -1) { 
         library[ 0 ].keywords.push(this.keywords[ j ]); 
         if (library[ 0 ].field.indexOf(this.field) == -1) { 
          library[ 0 ].field.push(this.field); 
         }; 
        }; 
       }; 
      }; 
     } 
    } 
}; 

var chemistry = new Discipline("chemistry", "electron"); 
chemistry.filter(library[0].title); 

document.writeln("KEYWORDS: " + library[0].keywords); 
document.writeln("FIELD: " + library[0].field); 

过滤器似乎不输出任何东西,我只是看到代码“关键词:字段:”在文档中。令人困惑的是,如果使用document.writeln()检查library [0] .field和library [0] .keywords,我会得到期望的值。

我想知道“这个”的范围。当我使用类构造函数时会发生变化。或者还在发生其他事情?另外,如果有人知道传递数组作为关键字参数的好方法,那将是非常值得赞赏的。现在我传递一个间隔的字符串并将其分开。

回答

0

是的,范围this正在改变。你可以这样做:

var that = this; 

然后在任何需要的地方使用that.keywords。所以在你的代码中,像这样:

class Discipline { 
    constructor(field, keyword) { 
     var that = this; 
     that.field = field; 
     that.keywords = keyword; 
     that.filter = function(title) { 
      var i; 
      for(i = 0 ; i < title.split(" ").length; i++) { 
      var title_part = title.toLowerCase().split(" ")[ i ]; 
      var j;      
       for(j = 0 ; j < that.keywords.length; j++) { 
        if (that.keywords[ j ] == title_part && library[ 0 ].keywords.indexOf(this.keywords[ j ]) == -1) { 
         library[ 0 ].keywords.push(that.keywords[ j ]); 
         if (library[ 0 ].field.indexOf(that.field) == -1) { 
          library[ 0 ].field.push(that.field); 
         }; 
        }; 
       }; 
      }; 
     } 
    } 
}; 
+0

所以当'var chemistry = new Discipline(“chemistry”,“electron”);'runs,这是什么。指的是? – Amotttier

+0

在构造函数(字段,关键字){}'部分中,'this'指向那个函数。然后,当你进入'that.filter = function(title){}',那么'this'现在指的是你所在的新函数。 – millerbr

+0

我更新了代码,但我仍然没有得到预期的结果https://jsfiddle.net/jo3ghoLm/ – Amotttier

相关问题