如何在函数对象javascript中访问属性函数

时间:2015-04-25 18:32:08

标签: javascript function

以下是我写的代码

var nums = [1, 5, 4, 2, 3];
var sortedNums = [1, 2, 3, 4, 5];

var sorter = function MakeSorter() {
    'sortNums': function(nums) {
        return this.nums.sort();
    };
};

QUnit.test("Numeric list can be sorted", function(assert) {
    var sorted = sorter.sortNums(nums);
    assert.deepEqual(sorted, sortedNums, "Passed!");
});

我的假设如下:

  1. sorter是一个引用MakeSorter()函数的函数对象

  2. sortNums是MakeSorter的一个属性,它被证明是一个对象,因此具有函数语法

  3. 但它会产生预期的错误“;”在宣布sortNums的行上。为什么?

2 个答案:

答案 0 :(得分:1)

也许您打算使用this

var nums = [1, 5, 4, 2, 3];
var sortedNums = [1, 2, 3, 4, 5];

var MakeSorter = function () {
    this.sortNums = function(nums) {
        return this.nums.sort();
    }
};

var sorter = new MakeSorter();

QUnit.test("Numeric list can be sorted", function(assert) {
    var sorted = sorter.sortNums(nums);
    assert.deepEqual(sorted, sortedNums, "Passed!");
});

您似乎认为在JavaScript中,函数对象,但略有不同。你想要做的是有点像JavaScript类。您正在使用常规功能,而不是对象。为了向函数添加函数,请使用this。这是简短的:

var MakeSorter = function () {
   //...
}

MakeSorter.sortNums = function (nums) {
    //...
}

答案 1 :(得分:0)

这会将sortNums上的属性sorter设置为您提供的函数。但是,我并不完全确定您在完成此操作时要做的是什么,并且可能有更好的方法来设计您尝试完成的行为。

  var nums = [1, 5, 4, 2, 3];
  var sortedNums = [1, 2, 3, 4, 5];

  var sorter = function MakeSorter() {};
  sorter.sortNums = function(nums) {
      return this.nums.sort();
  };

  QUnit.test("Numeric list can be sorted", function(assert) {
      var sorted = sorter.sortNums(nums);
      assert.deepEqual(sorted, sortedNums, "Passed!");
  });

简而言之,您的语法错误似乎是您正在将函数体声明与对象文字混合在一起。函数体内的语句({}之间)在调用函数时执行。您无法通过在对象文字语法{ prop : value }中添加属性来定义函数的属性。

var sorter = {
  sortNums: function(nums) {
      return this.nums.sort();
  }
};
如果分拣机不需要可调用,

可能更符合您的要求。