0

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

    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(););

我得到 undefined 作为对 .create.length() 的响应,甚至可以这样做吗?

4

5 回答 5

4

当您使用 调用该.create()方法时foo.create(),内部.create() thisfoo。所以这一行:

this.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());

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

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

于 2013-08-08T12:11:20.923 回答
1

在 :

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

thisfoo,因为您正在调用createusingsomething.create()而不是new MyObject.create()在这种情况下this将引用create. 这意味着这arrayLength不是函数的属性create,所以你不能这样调用它。

var foo = new (new MyObject).create();
console.log(foo.create.arrayLength(););

但是会起作用。

如果你告诉我们你想做什么,我们肯定会想一个不那么奇怪的方法。

于 2013-08-08T12:07:31.367 回答
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
于 2013-08-08T12:18:08.527 回答
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());
于 2013-08-08T12:20:40.950 回答
0

上面已经很好地解释了问题所在。

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

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

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

于 2013-08-08T12:22:03.907 回答