有点远射。但无论如何都要在构造函数的原型上获得链接属性,并且仍然将“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 ]
答案 0 :(得分:3)
this
为myArray.$
,与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所说,someOtherObject
与myArray
没有任何关系。
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()