是否可以捕获对象的(任何)属性何时被访问或尝试访问?
例:
我创建了自定义对象 Foo
var Foo = (function(){
var self = {};
//... set a few properties
return self;
})();
Run Code Online (Sandbox Code Playgroud)
然后有一些行动反对Foo- 有人试图访问财产bar
Foo.bar
Run Code Online (Sandbox Code Playgroud)
是否有方法(原型,也许)捕获这个?bar可能未定义Foo.我可以捕获任何尝试访问未定义属性的功能.
例如,如果bar未定义Foo,并且Foo.bar尝试了,例如:
Foo.prototype.undefined = function(){
var name = this.name; //name of property they attempted to access (bar)
Foo[name] = function(){
//...do something
};
return Foo[name];
}
Run Code Online (Sandbox Code Playgroud)
但功能性,不像我的例子.
概念
Foo.* = function(){
}
Run Code Online (Sandbox Code Playgroud)
背景
如果我有自定义函数,每次调用此函数时都可以监听(见下文).只是想知道是否有可能获得财产.
Foo = function(){};
Foo.prototype.call = function(thisArg){
console.log(this, thisArg);
return this; …Run Code Online (Sandbox Code Playgroud) 可能重复:
所有属性的JavaScript getter
JavaScript是否提供了访问未定义对象属性的方法?在PHP中,解决方案是__get()在类中声明和实现方法.
使用try { .. } catch { .. }的解决方案对我来说还不够,因为我已经拥有非常大量的代码,而这些代码实际上需要保持原样.
JavaScript有吸引力Object.defineProperty.因此,我可以在属性定义了getter random的window通过
Object.defineProperty(window, 'random', {
get: function () {
return Math.random();
}
});
random // Evaluates to a random number
Run Code Online (Sandbox Code Playgroud)
是否可以为给定对象定义"通用getter",而不管对象属性如何?我想做点什么
Object.universalGetter(window, function (propertyName) {
console.log('Accessing property', propertyName, 'of window.');
});
window.Function // Prints "Accessing property Function of window."
Run Code Online (Sandbox Code Playgroud)
我可以在JavaScript中使用"通用getter"吗?
我知道在javascript中,基元是通过值传递的,而对象是通过引用传递的。
我对创建某种解决方法感兴趣,该解决方法将使我能够获取对包含原始对象的对象属性的引用。例如,我希望能工作的是:
var someObject = {a: 1, b: 2};
var myRef = someObject.b;
myRef ++;
someObject.b #=> 3
Run Code Online (Sandbox Code Playgroud)
当然,这是行不通的。我知道您可以改为创建一个getter和setter函数,或使用一个对象来引用另一个对象,但是我真正想要的是一种变通方法,它允许我定义一个变量来作为对属性的引用。另一个对象,到目前为止,看来这是无法完成的。
因此,我的问题很简单:这是否可能?如果可以,怎么办?
我正在设计一个小型库,并试图尽可能地保持API,使用函数作为字典/对象本身的想法看起来很吸引人.
这个想法是能够通常调用一个函数:
fn('hello', 'some other extra info to be processed', etc...)
Run Code Online (Sandbox Code Playgroud)
此调用将处理信息,然后将其存储在某处.可以在某些条件下访问此处理过的信息(不是典型的用例),以这种方式获取信息会很棒:
fn['hello']
//-> some stuff
Run Code Online (Sandbox Code Playgroud)
例如,在python中,[]运算符重载会非常容易,但是AFAIK在JS中没有一种简单可靠的方法可以在大多数环境中工作(代理似乎可以做到这一点,但我们还没有到目前为止).由于用户可以输入任何值,因此不能选择getter和setter.
因此,我留下了函数对象的设置属性,这似乎很糟糕,因为我可能会覆盖函数的原始属性,例如:
applyprototype__proto__然而,JS世界中的许多东西都是hacky,我们很乐意每天都这样做.问题是:这是不安全的,会导致数千只小猫死亡吗?
可以在javascript中创建getter和setter,如下所示
Object.defineProperty
__define***__
Run Code Online (Sandbox Code Playgroud)
在所有这些实例中,属性的名称是已知的.
是否有可能创建一个通用的.
我的意思是,我有一个getter和/或setter,无论属性名称如何都会被调用.
这可能吗?如果是这样,怎么样?
问候.
注意:我在发布问题后找到了这些.看起来目前不可能作为第一个答案说明.
就在今天,我试图将使用Object.defineProperty()javascript中的方法的较旧的我的库包含到HTML文档中。我可以肯定,在以前的FireFox版本中,它运行良好。但是,如果我现在使用它,则在MaxOS 10.6.8的FF 19.02中,如下例所示:
var nuArray = function (values) {
for (var i in values) {this[i] = values[i]}
}
nuArray.prototype = Array.prototype;
var defaultProperties = {configurable: true, writable: true, enumerable: false, get: undefined, set: undefined, value: undefined};
Object.defineProperty(nuArray, "grep", defaultProperties)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
TypeError: property descriptors must not specify a value or be writable when a getter or setter has been specified @ ....
Run Code Online (Sandbox Code Playgroud)
我仅在稍后添加value,get和set部分,以将它们显式设置为undefined(默认情况下应将其设置为,但是由于这种行为开始时很奇怪,因此我想确保覆盖所有基础)。它在Safari 5.1.7中运行没有问题,并且正如我之前已经提到的那样,我非常确定它在FF的早期版本中是这样做的。足够奇怪的是,即使是现在,如果我只是将代码行复制到FF的控制台中,也不会引发任何错误,并且一切都会正常进行。它没有任何区别,如果我定义value,get或set。我是否有明显的遗漏或正在碰到新一版的浏览器不兼容问题?