0

有点长镜头。但是无论如何要在构造函数的原型上获得链式属性,并且仍然让“this”上下文指向原始对象实例。例如:

Array.prototype.$ = {};

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

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

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

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

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

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

它正确输出[ 1, 2, 3 ]

4

3 回答 3

3

this在你的功能是myArray.$,这与Array.prototype.$. 您可以执行console.log(myArray.$)or console.log(Array.prototype.$),它们将打印相同的结果myArray.$.where();

这是什么意思?当你打电话myArray.$.where();时,你实际上是在做Array.prototype.$.where();。所以它的 context( this) 变成Array.prototype.$了 ,所以它不会像你预期的那样工作。


还有一件事:扩​​展 DOM/内置对象原型通常被认为是有害的。我强烈建议尝试另一种方式。

于 2013-08-02T09:50:40.247 回答
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.

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

于 2013-08-02T10:04:59.513 回答
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()
于 2013-08-02T10:06:45.203 回答