我在js bin中有这个代码:
var validator = {
set (target, key, value) {
console.log(target);
console.log(key);
console.log(value);
if(isObject(target[key])){
}
return true
}
}
var person = {
firstName: "alfred",
lastName: "john",
inner: {
salary: 8250,
Proffesion: ".NET Developer"
}
}
var proxy = new Proxy(person, validator)
proxy.inner.salary = 'foo'
Run Code Online (Sandbox Code Playgroud)
如果我这样做proxy.inner.salary = 555;不起作用.
但是,如果我这样做proxy.firstName = "Anne",那么它的效果很好.
我不明白为什么它不起作用递归.
我试图扩展代理,如下:
class ObservableObject extends Proxy {}
Run Code Online (Sandbox Code Playgroud)
我使用Babel将其转换为ES5,我在浏览器中收到此错误:
app.js:15 Uncaught TypeError: Object prototype may only be an Object or null: undefined
Run Code Online (Sandbox Code Playgroud)
我查看了它指向的代码行.这是代码的一部分,箭头指向有问题的代码行:
var ObservableObject = exports.ObservableObject = function (_Proxy) {
_inherits(ObservableObject, _Proxy); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
function ObservableObject() {
_classCallCheck(this, ObservableObject);
return _possibleConstructorReturn(this, Object.getPrototypeOf(ObservableObject).apply(this, arguments));
}
return ObservableObject;
}(Proxy);
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么我可能会收到此错误?这是巴贝尔的错误吗?当您尝试扩展代理时应该发生什么?
IE11不会也不会实现ES2015代理对象.然而,IE11的延长支持终止于2025年10月14日.
有没有办法为IE11填充代理对象?所有其他浏览器都支持Proxy.
如果是,那么我们今天都可以在生产中使用它.如果没有,那么我们将不得不等待近十年......
编辑:我专门针对IE11,因为我知道IE通常具有我通常不知道的IE特定功能.
Edit2:我特别感兴趣的是能够实现一个全能拦截器.与__getattr__Python 类似.它只需要在IE11中工作.
javascript internet-explorer ecmascript-6 internet-explorer-11 es6-proxy
我想知道如何从 JavaScript 中的代理目标值中获取数组。我有这样的东西:
Proxy :
[[target]] : Array // the array I need to extract
[[handler]] : Object
[[IsRevoked]] : false
Run Code Online (Sandbox Code Playgroud) 我做了下面的课来"劫持"这个console.log功能.这背后的原因是我想动态添加和删除值
.它将用于调试目的,因此函数调用 的起源console.log()很重要.在下面的代码中,我将在评论中解释我的逻辑.
export class ConsoleLog {
private _isActive = false;
private _nativeLogFn: any;
constructor() {
// ----------------------
// Store the native console.log function, so it can be restored later
// ----------------------
this._nativeLogFn = console.log;
}
public start() {
if (!this._isActive) {
// ----------------------
// Create a new function as replacement for the native console.log
// function. *** This will be the subject of my question ***
// ----------------------
console.log = console.log.bind(console, …Run Code Online (Sandbox Code Playgroud) 我希望用户只为对象设置特定属性,但同时应该从自定义类构造该对象.
例如
var row = new Row({
name : 'John Doe',
email : 'uhiwarale@gmail.com'
}, Schema);
Run Code Online (Sandbox Code Playgroud)
row可以有方法.但是当用户尝试设置时row.password,不允许这样做.
一种方法是使用new Proxy而不是new Row然后我们将放弃我们在Row课堂上做的所有很酷的事情.我想new Row返回一个代理对象this作为代理目标引用.
有人对此有什么想法吗?如果你知道mongoose,怎么mongoose做呢?
class A extends HTMLElement {
constructor() {
super()
return new Proxy(this, {})
}
}
window.customElements.define('a-element', A)Run Code Online (Sandbox Code Playgroud)
<a-element></a-element>Run Code Online (Sandbox Code Playgroud)
我如何代理自定义元素?
当我尝试它:
Uncaught InvalidStateError: custom element constructors must call super() first and must not return a different object.
例如,如果我有这个处理程序/代理(来自MDN示例)...
var handler = {
get: function(target, name){
return name in target?
target[name] :
37;
}
};
var p = new Proxy({}, handler);
p.a = 1;
p.b = undefined;
console.log(p.a, p.b); // 1, undefined
console.log('c' in p, p.c); // false, 37
Run Code Online (Sandbox Code Playgroud)
是否可以探测代理,p以某种方式允许我获取handler对象.
有点像:
p.__handler__ // returns handler object -> Object {get: handler.get(), set: handler.set(), ...}
p.__handler__.get // returns get prop/fn of handler -> function(target, name){ ...}
Run Code Online (Sandbox Code Playgroud)
显然,在处理程序中设置的各种陷阱仍然对代理"已知",但有一种明确的方式从代理本身返回它们/处理程序吗?如果是这样,怎么样?
我目前没有具体的用例,但如果您想在已经拥有代理之后动态更改处理程序/陷阱,我可以看到这很有用.
我有一个简单的ES6类,如下所示:
class Ring extends Array {
insert (item, index) {
this.splice(index, 0, item);
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
我想这样做,以便Ring对象的索引包装,所以new Ring(1, 2, 3)[3]返回1,new Ring(1, 2, 3)[-1]返回3,依此类推.这可能在ES6中吗?如果是这样,我将如何实现它?
我已经阅读了代理,它允许完全自定义的getter,但我无法弄清楚如何将代理应用于类.我确实管理了这个:
var myRing = new Proxy (Ring.prototype, {
get: function (target, name) {
var len = target.length;
if (/^-?\d+$/.test(name))
return target[(name % len + len) % len];
return target[name];
}
});
Run Code Online (Sandbox Code Playgroud)
myRing现在是一个支持包装索引的Ring对象.问题是我每次都必须定义像这样的Ring对象.有没有办法将此代理应用于类,以便调用new Ring()返回它?
我有一个抽象类:
abstract class Foo {
abstract bar(): string;
}
Run Code Online (Sandbox Code Playgroud)
我有一些扩展的类Foo:
class Foo1 extends Foo {
bar(): string { return 'foo1'; }
}
class Foo2 extends Foo {
bar(): string { return 'foo2'; }
}
Run Code Online (Sandbox Code Playgroud)
我还有一个类,我要代理的所有方法Foo的Foo。这实际上工作正常,如果我Foo在这个类上定义所有方法。但我宁愿不这样做。我宁愿让Foo定义的方法Foo和编译器知道FooProxy也实现了这些方法,而不必实际实现它们。这可能吗?Proxy 类看起来像这样:
class FooProxy {
public foo: Foo;
constructor(foo: Foo) {
this.foo = foo;
let handler = {
get: function(target: FooProxy, prop: string, receiver: any) {
if(Foo.prototype[prop] !== null) {
return target.foo[prop]; …Run Code Online (Sandbox Code Playgroud) es6-proxy ×10
javascript ×9
ecmascript-6 ×6
es6-class ×3
proxy ×2
typescript ×2
angular ×1
arrays ×1
babeljs ×1
console.log ×1
target ×1