相关疑难解决方法(0)

所有浏览器的Object.watch()?

请务必阅读以下所有评论.不推荐使用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 jquery dom-events

116
推荐指数
5
解决办法
9万
查看次数

Javascript:运算符重载

我已经使用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类中的运算符吗?因为这看起来很丑陋.

javascript operator-overloading operators

72
推荐指数
9
解决办法
5万
查看次数

我可以使用ES2015课程扩展代理吗?

我试图扩展代理,如下:

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)

有谁知道为什么我可能会收到此错误?这是巴贝尔的错误吗?当您尝试扩展代理时应该发生什么?

javascript ecmascript-6 babeljs es6-proxy

32
推荐指数
4
解决办法
7535
查看次数

jQuery选择器是否返回HTML Element或jQuery对象的数组?

什么存储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

jquery

17
推荐指数
3
解决办法
3万
查看次数

javascript中强类型容器的更好选择

我刚刚发现了在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)

但这似乎会产生大量的开销,不断复制这样的变量.

我忽略了简单的事情吗?

javascript arrays oop class object

5
推荐指数
1
解决办法
2627
查看次数

使Rational类能够处理数学运算符

我有这个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

5
推荐指数
1
解决办法
206
查看次数

我可以在Typescript中创建一个class []运算符

有没有办法覆盖打字稿中的[]操作?我们使用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).

有没有办法做到这一点?

感谢和抱歉这个令人难以置信的不准确的初始问题.

typescript typescript1.4

4
推荐指数
1
解决办法
4515
查看次数