请务必阅读以下所有评论.不推荐使用Object.Watch和Object.Observe.请参阅Elliot B对更新(截至2018年6月)方法的评论.
我一直在寻找一种简单的方法来监控对象或变量的变化,我发现Object.Watch,Mozilla浏览器支持这种方式,但IE不支持.所以我开始四处寻找,看是否有人写过某种等价物.
关于我发现的唯一一件事是jQuery插件,但我不确定这是不是最好的方法.我当然在大多数项目中都使用jQuery,所以我并不担心jQuery方面......
无论如何,问题是:有人能告诉我一个jQuery插件的工作示例吗?我有问题让它工作......
或者,是否有人知道任何可以跨浏览器工作的更好的替代品?
答案后更新:
谢谢大家的回复!我试过这里发布的代码:http: //webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html
但我似乎无法使其与IE一起工作.下面的代码在Firefox中运行良好,但在IE中没有任何作用.在Firefox中,每次Object.Observe更改Object.watch()时watcher.status都会调用in ,您可以在页面上看到输出.在IE中,这不会发生,但我可以看到document.write()更新值,因为最后一次watcher.watch()调用显示正确的值(在IE和FF中).但是,如果没有调用回调函数,那那就毫无意义...... :)
我错过了什么吗?
var options = {'status': 'no status'},
watcher = createWatcher(options);
watcher.watch("status", function(prop, oldValue, newValue) {
document.write("old: " + oldValue + ", new: " + newValue + "<br>");
return newValue;
});
watcher.status = 'asdf';
watcher.status = '1234';
document.write(watcher.status + "<br>");
Run Code Online (Sandbox Code Playgroud) 我已经使用JavaScript了几天了,并且我想要为我定义的对象重载操作符.
在谷歌搜索这个问题后,似乎你无法正式做到这一点,但有一些人声称有一些冗长的方式来执行此操作.
基本上我已经制作了一个Vector2类,希望能够做到以下几点:
var x = new Vector2(10,10);
var y = new Vector2(10,10);
x += y; //This does not result in x being a vector with 20,20 as its x & y values.
Run Code Online (Sandbox Code Playgroud)
相反,我必须这样做:
var x = new Vector2(10,10);
var y = new Vector2(10,10);
x = x.add(y); //This results in x being a vector with 20,20 as its x & y values.
Run Code Online (Sandbox Code Playgroud)
我可以采用一种方法来重载Vector2类中的运算符吗?因为这看起来很丑陋.
我试图扩展代理,如下:
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)
有谁知道为什么我可能会收到此错误?这是巴贝尔的错误吗?当您尝试扩展代理时应该发生什么?
什么存储Q?
Q = $('div');
Q2 = document.getElementsByTagName('div');
Run Code Online (Sandbox Code Playgroud)
我可以通过使用来访问每个HTML元素Q[index],类似于Q2[index]; 这看起来像是Q一个HTML元素数组.
在另一方面,我可以做Q.filter(),但我不能做Q2.filter(); 这使它看起来像是Q一个jQuery对象的数组.
或者它是两者,Q一个jQuery对象,其中包含一堆HTML元素?如果是这种情况,不会console.log()检测到Q内部有对象集合的对象吗?这个小提琴,http://jsfiddle.net/rkw79/3s7tw/,表明它们是一样的.
注意:我知道Q.eq(index)将返回一个可以使用jQuery方法的对象.我只是想知道到底是什么Q
我刚刚发现了在javascript中创建假"类"的方法,但我想知道如何存储它们并且仍然可以在IDE中轻松访问它们的功能.
像这样:
function Map(){
this.width = 0;
this.height = 0;
this.layers = new Layers();
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个循环遍历XML并创建多个Map()对象的函数.如果我将它们存储在单个变量下,我可以很好地访问它们,例如:
map1 = new Map();
map1.height = 1;
Run Code Online (Sandbox Code Playgroud)
但我不知道他们将以什么名字存储!所以我想我可以像这样保存它们:
mapArray = {};
mapArray['map1'] = new Map();
Run Code Online (Sandbox Code Playgroud)
但你无法访问这样的函数:(至少IDE代码完成不会捡起它)
mapArray['map1'].height = 1;
Run Code Online (Sandbox Code Playgroud)
然后我认为这将是最好的解决方案:
function fetch(name){
var fetch = new Map();
fetch = test[name];
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以写:
fetch('test').height = 1;
Run Code Online (Sandbox Code Playgroud)
但这似乎会产生大量的开销,不断复制这样的变量.
我忽略了简单的事情吗?
我有这个Rational类,每个操作都有一个方法(add,mult等)
function Rational(nominator, denominator){
this.nominator = nominator;
this.denominator = denominator || 1;
}
Rational.prototype = {
mult: function(that) {
return new Rational(
this.nominator * that.nominator,
this.denominator * that.denominator
);
},
print: function() {
return this.nominator + '/' + this.denominator;
}
};
var a = new Rational(1,2),
b = new Rational(3);
console.log( a.mult(b).print() ); // 3/2
Run Code Online (Sandbox Code Playgroud)
我可以让它更"自然",例如启用console.log( a * b )吗?
javascript dsl operator-overloading fractions prototypal-inheritance
有没有办法覆盖打字稿中的[]操作?我们使用1.4,所以我们可以使用需要1.4的解决方案.
更新:我在最初的问题中非常不清楚.我的意思是我可以将其作为操作符添加到类中.在我的班上,我现在有一个方法:
public get(index : number) : LinkedListNode<t> {
if (this._first === null || (index >= this._count)) {
return null;
}
var node = this._first;
while (index-- > 0) {
node = node._next;
}
return node;
}
Run Code Online (Sandbox Code Playgroud)
我宁愿能够调用数据[5]而不是data.get(5).
有没有办法做到这一点?
感谢和抱歉这个令人难以置信的不准确的初始问题.
javascript ×5
jquery ×2
arrays ×1
babeljs ×1
class ×1
dom-events ×1
dsl ×1
ecmascript-6 ×1
es6-proxy ×1
fractions ×1
object ×1
oop ×1
operators ×1
typescript ×1