我用JavaScript构建了一个对象源 有没有办法像这样在一行中调用一些方法:
var x = new object("aaa").method_a().method_b().method_c();
答案 0 :(得分:0)
如果你想链接函数调用,你需要从函数中返回this
function method_a(){
// do something
return this;
}
其他功能相同 -
然后你可以var x = new object("aaa").method_a().method_b().method_c();
答案 1 :(得分:0)
这样做的方法是让每个方法返回对象本身。例如:
function Person() {};
Person.prototype.setName=function(n){
this.name=n;
return this;
}
Person.prototype.setAge=function(a) {
this.age=a;
return this;
}
var p= new Person().setName("John").setAge(20);
显而易见的问题是,如果方法必须返回任何其他值(你可以使用setter但不能使用getter),那么你不能这样做。
答案 2 :(得分:0)
如果您的对象不支持流体接口,您始终可以将该功能包装在其上:
function FluidWrapper(obj)
{
var o = {};
for (var p in obj) {
if (typeof obj[p] == 'function') {
o[p] = function(method) {
return function() {
obj[method].apply(obj, [].slice.call(arguments, 0));
return o;
};
}(p);
}
}
return o;
}
var x = new object("aaa");
FluidWrapper(x).method_a().method_b().method_c();
答案 3 :(得分:0)
虽然穆罕默德·阿迪尔的答案是最常见的情况,但我觉得这些可能性尚未得到适当的探索。
函数返回一个值。在JavaScript中,您可以在除null和undefined之外的任何值上调用方法。这意味着这是完全可以接受的:
var x = 987654321;
var y = x.toString().split('').sort().join('0');
在这种情况下,
toString()
的数字上调用987654321
方法,并返回一个字符串。 split('')
方法,其内部值为'987654321'
并返回一个数组。 sort()
方法:['9','8','7','6','5','4','3','2','1']
并返回相同的数组(但已排序)。 join('0')
方法,但保持值['1','2','3','4','5','6','7','8','9']
并返回一个字符串。 y
包含值'10203040506070809'
; 因此,链接方法作用的对象不必是相同的,只要您知道该对象的每一步都是。
如果在对象上调用了一个方法,那么该方法this
内部将引用该对象。因此,如果你return this;
,那么之后可以调用该对象的另一种方法。
重要的是要注意,有时您想要返回相同类型的新对象,而不是更改对象并返回它。链接时两者都同样有效,但结果不同。考虑以下jQuery示例:
var divs = $('div'); // all divs on the page
var marked = divs.filter('.marked'); // all marked divs on the page
marked.css('color', 'red'); // make marked divs red
因为filter方法返回一个新的jQuery对象,所以初始divs变量仍然包含页面上的所有div。如果过滤方法是从jQuery对象中消除它被调用并返回它,那么div将指向与标记相同的对象,因此将不再拥有页面上的所有div。 从链接的角度来看,两个潜在的实现之间没有任何变化(除了一些丢弃的对象):
$('div').filter('.marked').css('color', 'red');