首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是节点等同于Perl的神奇的``tie()‘机制(链接到/拦截对变量的访问)?

什么是节点等同于Perl的神奇的``tie()‘机制(链接到/拦截对变量的访问)?
EN

Stack Overflow用户
提问于 2014-10-28 15:47:13
回答 1查看 56关注 0票数 0

我正在寻找类似于下面这个例子的内容,即用用户定义的回调/钩子拦截对字符串、数组和对象变量的访问:

代码语言:javascript
运行
复制
var foo = [];
tie( // hypothetical
    foo,
    {
        STORE: // callback triggered when assigning: foo[index] = value
        function(self, index, value) {
            if (value.match('fnord')) {
                self[index] = "Nothing to see here. Move along.";
                return;
            }
            self[index] = value;
        },
        FETCH: // callback triggered when accessing: foo[index]
        function(self, index) {
            if (42 == index) {
                return "This is The Answer.";
            }
            return self[index];
        }
    }
);

该概念的工作实现的简单演示:

代码语言:javascript
运行
复制
package Quux;
use Tie::Array ();
use base 'Tie::StdArray';
sub FETCH {
    my ($self, $index) = @_;
    return 'This is The Answer.' if 42 == $index;
    return $self->[$index];
}
sub STORE {
    my ($self, $index, $value) = @_;
    if ($value =~ 'fnord') {
        $self->[$index] = 'Nothing to see here. Move along.';
        return;
    }
    $self->[$index] = $value;
}

package main;
tie my @foo, 'Quux';
@foo = (undef) x 50;
print $foo[42];
$foo[0] = 'fnord';
print $foo[0];

完整文档:平局 (概念),tie() (函数),Tie::数组魔术

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-28 15:58:37

与此功能大致相当的是代理API。这是一个ES6特性,但是V8已经为它提供了“实验性”支持(使用--harmony--harmony-proxies启动节点以启用此功能)。下面是用代理重写的代码片段:

代码语言:javascript
运行
复制
var foo = (function() {

    var obj = {};
    return Proxy.create({
        set: function(self, index, value) {
            if (value.match(/fnord/)) {
                obj[index] = "Nothing to see here. Move along.";
                return;
            }
            obj[index] = value;
        },
        get: function(self, index) {
            if (42 == index) {
                return "This is The Answer.";
            }
            return obj[index];
        }
    });

})();

console.log(foo[42]);
foo[0] = 'fnord';
console.log(foo[0]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26612626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档