JavaScript - 具有正确“this”上下文的原型上的链接属性

时间:2013-08-02 09:37:29

标签: javascript prototype

有点远射。但无论如何都要在构造函数的原型上获得链接属性,并且仍然将“this”上下文指向原始对象实例。例如:

Array.prototype.$ = {};

Array.prototype.$.where = function(selector) {
    console.log(this);
    return;
};

var myArray = [ 1, 2, 3 ];
myArray.$.where();

控制台输出{ where: [Function] },'this'上下文指向 where function $ object而不是数组本身。

但是,如果我将其更改为:

Array.prototype.where = function(selector) {
    console.log(this);
    return;
};

var myArray = [ 1, 2, 3 ];
myArray.where();

正确输出[ 1, 2, 3 ]

3 个答案:

答案 0 :(得分:3)

您的函数的{p> thismyArray.$,与Array.prototype.$完全相同。您可以执行console.log(myArray.$)console.log(Array.prototype.$),他们将使用myArray.$.where();打印相同的结果

这意味着什么?当您致电myArray.$.where();时,您实际上在做Array.prototype.$.where();。因此它的上下文(this)变为Array.prototype.$,因此它无法按预期工作。


还有一件事:extending the DOM/built-in object prototype is generally considered harmful。我强烈建议尝试另一种方式。

答案 1 :(得分:1)

我认为不可能这样:因为$是一个普通的对象,它可以被许多对象引用(即使在这种情况下,只有一个,Array.prototype.$)因此,从$内部无法分辨出您正在使用哪些参考文献来访问它。

我的意思是:

Array.prototype.$ = {};
someOtherObject = Array.prototype.$;

Array.prototype.$.where = function(selector) {
    console.log(this);
    return;
};

var myArray = [ 1, 2, 3 ];
myArray.$.where();
console.log(myArray.$)
someOtherObject.where()

正如Mics所说,someOtherObjectmyArray没有任何关系。

P.S。这就是说,我仍然觉得必须有一些简单的方法来做到这一点,而不会进一步使界面复杂化......

答案 2 :(得分:1)

您无法做到,但如果您无法更改初始定义,可能的解决方法是:

//<definitions>
Array.prototype.$ = {}; 

Array.prototype.$.where = function(selector) {
    console.log(this);
    return;
};
//</definitions>

Array.prototype.dollarCall = function(fName, arg) {
    this.$[fName].call(this,arg);
}

var myArray = [ 1, 2, 3 ];
myArray.dollarCall('where');

我重复一遍。这只是特定情况的解决方法。否则你应该使用自己的第二种方法

如果你可以改变你的定义,另一种可能的解决方案:

Array.prototype.extend = function() {
    var array = this;
    this.$ = {
        where : function() {
            console.log(array);
        }
    }
}

var myArray = [ 1, 2, 3 ];
myArray.extend();
myArray.$.where()