Javascript闭包属性操作

时间:2015-06-05 11:56:07

标签: javascript d3.js

这里有几个线程可以解决这个问题,但没有一个线程可以清楚简洁地回答我的问题。

如果我有以下功能;

function test(){
    var abc = "some value";

    return function concat(str) {
        return str + " " + abc;
    }
}

这样我可以将字符串与闭包中包含的“some value”字符串连接起来,如下所示

var myStr = test()
console.log(myStr("this is"))

在某种程度上我可以在定义myStr时操作abc变量吗?

我最近一直在与d3合作,建筑规模如下:

var myScale = d3.scale.linear()
    .domain(...)
    .range(...)

我猜测它的幕后工作方式与我想要实现的方式类似。

编辑:这是我想要实现的目标;

function test(){
    var abc = "some value";

    function concat(str) {
        return str + " " + abc;
    }
    concat.abc = function(value) {
        if (!arguments.length) { return abc;}
        abc = value;
        return concat;
    }
    return concat;
}

var myStr = test()
    .abc("another test")

console.log(myStr("this is"))

不确定我是否完全关注正在发生的事情。

concat.abc是否引用了concat中的abc属性?为什么我们从concat.abc属性定义中返回concat?

1 个答案:

答案 0 :(得分:0)

您可以在javascript中创建类,然后为闭包内的值创建setter和getter。 这是一个例子:

function test() {

  var abc = "default value";

  this.setAbc = function(text) {
    abc = text;
    return this;
  }

  this._concat=function(str) {
    return str + " " + abc;
  }
}

var myStr = new test();

document.write(myStr.setAbc("new value")._concat("this is"))