0

我敢肯定我以前在某个地方见过这个。我刚开始看原型,所以我不太了解。

什么是正确的原型声明,以便捕获所有对变量的请求?myObject 是具有更改原型的对象。

“myObject.x”会被该函数捕获,然后我会在其中记录有一个调用试图访问“x”并根据调用的内容返回 x(不是很重要)。

(x 可以是任何有效的变量名) 编辑:所以 'myObject.foo' 会给出 'foo' 的控制台输出,而 'myObject.bar' 会返回 'bar'

我已经在一个脚本中看到过这种情况,其中变量在返回之前已更改,但我记不起它来再次找到它。

4

3 回答 3

1

您可以创建x一个方法(而不是属性),在子类中覆盖它(添加您的日志记录调用),然后用于prototype.x.call调用超级方法。

var Foo = function () {
    this.x = function () {
        console.log('ancestor x');
    }
}

var Bar = function () {
    this.x = function () {
        console.log('inherited x');
        Bar.prototype.x.call(this);
    }
}

Bar.prototype = new Foo;

new Bar().x();

否则,有一些供应商扩展和 ES5/6 getter 方法,但您将不得不应对这些选项中任何一个的不稳定浏览器支持。

小提琴

于 2013-03-27T01:20:19.097 回答
0

什么是正确的原型声明,以便捕获所有对变量的请求?myObject 是具有更改原型的对象。

这与 JavaScript 的原型继承并没有真正的关系。可以通过new在构造函数上使用关键字及其prototype属性来创建具有原型的对象,或者通过Object.create. 您感兴趣的是如何构造一个对象,每个属性都可以访问......</p>

会被函数捕获

不幸的是,当前的 JavaScript 无法做到这一点。您只能设置具有特定名称的属性(使用值,或使用 getter/setter),目前还没有实现包罗万象的行为 - 尽管一些引擎支持该Proxy草案。为此,请参阅属性是否具有等效的 __noSuchMethod__ 功能,或者在 JS 中实现它的方法?带有默认值的Javascript数组(相当于Python的defaultdict)?在读取之前设置未定义的 javascript 属性


我认为这最接近您想要的 - 使用显式 getter 函数而不是属性:

function Entity() {
   this.data = {position_X:5, foo:"bar", …};
}
Entity.prototype.get = function (name) {
    console.log("access on "+name);
    return this.data[name];
};

var entity = new Entity;
entity.get("x"); // undefined, but logs "access on x"
entity.get("position_X"); // 5, and logs "access on position_X"
entity.get("foo"); // "bar", and logs "access on foo"
于 2013-03-27T01:45:31.997 回答
0

您正在寻找getter/setter

foo = {};
var x;
Object.defineProperty(foo, 'x', {
    get: function () {
        console.log("Getting:",x);
        return x; // or not..
    },
    set: function (val) {
        console.log("Setting to:", val);
        x = val;
        return x;
    }
});

当然,这些不适用于旧版浏览器。

编辑:我已经为这种事情创建了 Waject:https ://github.com/spn/Waject

于 2013-03-27T01:25:24.807 回答