我可以创建一个函数,它是对象中函数的属性吗?

时间:2013-08-08 12:01:50

标签: javascript

我想访问像这样的对象中的函数

    function MyObject()
    {
        this.create = function(array)
        {
             var myArray = array;
             this.arrayLength = function(){return myArray.length;}

             // Do something else here...
        }
    }
    var foo = new MyObject();
    foo.create(value);
    console.log(foo.create.arrayLength(););

我未定义为.create.length()的响应,是否可以这样做?

5 个答案:

答案 0 :(得分:4)

当您使用.create()调用foo.create()方法时,.create() this内的foothis.arrayLength = function(){return myArray.length;} 。所以这一行:

arrayLength()

foo上创建方法console.log(foo.arrayLength()); 。所以只需使用:

arrayLength()

如果出于某种原因,您确实希望create成为this.create.arrayLength = function(){return myArray.length;} 的方法,那么您可以这样做:

console.log(foo.create.arrayLength());

然后使用原文:

{{1}}

(减去结束括号之前的额外分号)。

但是虽然后一版本“有效”,但这似乎是一种奇怪的方式。

答案 1 :(得分:1)

in:

this.create = function(array)
{
     var myArray = array;
     this.arrayLength = function(){return myArray.length;}
}

this引用foo,因为您使用create而不是something.create()来调用new MyObject.create(),在这种情况下this会引用create arrayLength的实例。这意味着create不是函数var foo = new (new MyObject).create(); console.log(foo.create.arrayLength();); 的属性,因此您无法以这种方式调用它。

{{1}}

但是会工作。

如果你告诉我们你想做什么,我们肯定会想到一种不太奇怪的方式。

答案 2 :(得分:0)

我不确定你的最终目标是什么,所以我会说一些我还没有看到的东西

var foo = new MyObject();
// `foo` has no property _arrayLength_
foo.create([1, 2, 3]); // _create_ sets `this.arrayLength`
// `foo` now has property _arrayLength_
foo.arrayLength(); // 3

答案 3 :(得分:0)

以下是对代码的修复,只需更改:

function MyObject() {

  function arrayCreate(array) {
    var myArray = array;
    arrayCreate.arrayLength = function() {
      return myArray.length;
    }
  }

  this.create = arrayCreate;
  // Do something else here...
}
var foo = new MyObject();
foo.create([1,2,3]);
console.log(foo.create.arrayLength());

答案 4 :(得分:0)

很好地解释了问题所在。

所以要修复它,只需更改定义arrayLength方法的行。

更改此行:this.arrayLength = func...

对此:this.create.arrayLength = func...