【发布时间】:2016-04-22 06:04:37
【问题描述】:
考虑这段代码:
app.mediaLibrary = new function MediaLibrary() {
var self = this;
self.media = new Proxy([], {
set(target, key, value) {
console.log(`Setting value ${key} as ${value}`)
if (!(value instanceof self.Media))
throw new Error(`${value} is not instance of Media.`)
target[key] = value;
return true
},
get (target, key) {
console.log(`Getting value ${key} as ${target[key]}`)
return target[key]
}
});
self.Media = function Media(file, fileReader) {
this.src = fileReader.result;
this.file = file;
}
return self;
}
每当我打电话给app.mediaLibrary.media.push(new app.mediaLibrary.Media("", ""))
在控制台中我看到了这个:
Getting value push as function push() { [native code] }
Getting value length as 0
Setting value 0 as [object Object]
Setting value length as 1
Uncaught Error: 1 is not instance of Media.(…)
我明白为什么我会看到这个,但我该如何围绕它编写代码?看来我的陷阱是由内部(push,length)和外部调用([0]=...)触发的,我不知道如何区分它们。有什么想法吗?
【问题讨论】:
-
我不明白你的差异化方案。如果一个电话可以被视为“外部”,那么肯定是
push。它依次调用“get length”和“set 0”。那么究竟是什么将属性的访问限定为内部的呢? -
我没有在我的代码中调用 get length,所以它是内部/隐式调用,而不是外部/显式调用。
-
根据该定义,世界上的每个库都只包含内部调用。即使有人在回调中调用您的代码。这没有多大意义。
-
是的,你明白了。在我的情况下,该库是数组的香草实现。无论如何,你知道我该如何解决我的问题吗?
-
“我怎样才能解决我的问题” 我对你想要达到的目标有一个模糊的概念 - 由于显而易见的原因这是不可能的 - 但老实说我没有看到需要解决的问题。
标签: javascript ecmascript-6 es6-proxy