我一直在与这个项目进行斗争并理解这个概念,但却无法理解如何获得最终结果。
鉴于此代码:
<!doctype html>
<html>
<head>
<title> Make an objects methods chainable </title>
<meta charset="utf-8">
<script>
function modifyFunction(f) {
return function() {
var returnValue = f.apply(this, arguments);
if (returnValue === undefined) {
return this;
} else {
return returnValue;
}
};
}
function modifyMethod(o, m) {
// your code here
//the object being passed is the var o
//the method being passed is the add or sub functions contained in the
// var
var methodIn = o[m];
var objectIn = o;
var numIn;
console.log("Method In: " + methodIn);
console.log("Object In: " + objectIn);
if (o.hasOwnProperty(m) ) {
var property = o[m];
console.log(property);
console.log("o has property " + m);
modifyFunction(this);
if (methodIn instanceof Function) {
// if (this instanceof o) {
modifyFunction(o);
return this;
console.log("This after modifyFunction: " + this);
console.log("after modifyFunction " + this);
}
modifyFunction(m);
}
if (!o.hasOwnProperty(m)) {
console.log("Function not contained in Object");
}
}
var o = {
num: 0,
add: function(x) {
this.num += x;
},
sub: function(x) {
this.num -= x;
}
};
// We cannot chain object o(s) method because they do not return
//--this--
//o.add(4).sub(2); // fail - the methods are not chainable yet!
// Make the add method chainable.
modifyMethod(o, "add");
// Now we can chain the add methods
o.add(2).add(4);
//console.log(o.num); // o.num = 6
// Now make the sub method chainable
//modifyMethod(o, "sub");
// Now we can chain both the sub and add methods
//o.sub(1).add(3).sub(5);
//console.log(o.num); // o.num = 3
</script>
</head>
<body>
</body>
</html>
目标是使用hasOwnProperty和instanceof来检查传入的对象是否传入了method属性,我理解这一点并且可以在控制台中看到结果。应该检查instanceof以查看对象的属性是否是函数的实例,我对此不太清楚并且继续收到错误消息(函数预期)。如果我正确理解这一点,我需要将信息传递给modifyFunction来执行计算吗?
我看到对象被传递给函数和方法(add和sub)函数,但是无法弄清楚我需要做些什么才能使它工作。我为此代码提前道歉,但有人可以帮我理解如何将“这个”整合在一起吗?
我查看了有关此主题的所有帖子,但仍无法通过我的头脑。 谢谢!
答案 0 :(得分:0)
函数可以像JavaScript中的变量一样传递,但它们本质上是不可变的,就像字符串一样。如果我给你这个代码:
a = "my string";
b = a;
...然后要求您将a
更改为&#34;您的字符串&#34;,但没有任何a =
块(因此,更改实际的&#34;我的字符串&# 34;对象,而不是参考),然后禁止一些可能极端的JS黑客措施,你无法做到。他们创建并保持不变 - 但通常有方法可以创建与现有类似的方法。
同样,因为你不能改变&#34;一个函数,modifyFunction
并没有完全按照您的想法行事,因为您并未将其调用结果分配给任何内容。因此,在某些方面,我批评的是术语差异 - 你无法修改&#34;一个函数,但是,您可以将其本地参考替换为引用原始参考并执行您喜欢的参考。尝试替换这部分代码;并且您可以删除modifyFunction
if (methodIn instanceof Function) {
// if (this instanceof o) {
o[m] = modifyFunction(m);
return o;
}
你最近注意到的另一个问题是你将对象传递给modifyFunction
,而不是方法。此外,您的功能无法以正确的方式调用以使用this
关键字。它是从全局上下文中调用的,因此this
可能只是window
。只需将this
的任何其他必要参考更改为o
,就可以了。