Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:除了属性之外,我可以执行与调用相同的操作吗?_Javascript - Fatal编程技术网

javascript:除了属性之外,我可以执行与调用相同的操作吗?

javascript:除了属性之外,我可以执行与调用相同的操作吗?,javascript,Javascript,我理解这个调用允许您传入一个对象来代替调用该方法的“this” "abc".charAt.call("defgh",1); "e" 但是假设我想将length属性应用于该对象 我不能说 "abc".length.call("defgh"); 我会出错的 我可以为某个属性(例如长度)执行此操作吗 添加了[自从添加之后,我看到的关于这个问题的3个答案都很好] 似乎有些人认为我在质疑如何调用属性(这毫无意义)。我不是 有些人认为我是在暗示“z”.charAt(“asdf”,0)比“asdf”好。c

我理解这个调用允许您传入一个对象来代替调用该方法的“this”

"abc".charAt.call("defgh",1);
"e"
但是假设我想将length属性应用于该对象

我不能说

"abc".length.call("defgh");
我会出错的

我可以为某个属性(例如长度)执行此操作吗

添加了[自从添加之后,我看到的关于这个问题的3个答案都很好]

似乎有些人认为我在质疑如何调用属性(这毫无意义)。我不是

有些人认为我是在暗示“z”.charAt(“asdf”,0)比“asdf”好。chatAt(0)我不是

我想说的是,您可以使用对方法的调用,使其在不同的对象上执行/计算。如果你真的需要看一个更有用的例子,我可以举一个更有用的例子

[1].forEach.call(“asdf”,函数(x){console.log(x+x);})

Array.prototype.forEach.call(“asdf”,函数(x){console.log(x+x);})

所以forEach可以比For循环更简洁

因此,尽管最初我给call举的例子并不有用,但你瞧,一个有用的例子是存在的

房产也是如此

我可能希望为要计算的属性(例如“长度”)应用不同的对象。这在理论上不应该是不可能的(正如一位回答者在删除其答案之前所建议的那样)。我没有一个特别的用途,我可以想出,这将有利于评估一个不同的对象上的财产,但它不应该是不可能的


仅仅因为我没有它的用处,并不意味着它应该被扔掉。请记住,在给出方法调用的良好用法之前,有些人说它毫无意义,然后我给出了它的潜在用法。这并不是说它在理论上/原则上是不可能的。

没有等效的方法将
.length
属性背后的功能应用到不同的对象。Javascript没有这个功能

部分原因是因为一个属性可能只是一个固定在对象上的属性中的静态值,因此在另一个对象上计算
“ttt”.length
属性是有意义的。您可以在另一个对象上访问
.length
属性,但在另一个对象上使用
“ttt”
对象的
.length
属性没有语义意义。你唯一的语义就是名字。您可以在另一个对象上使用该名称,如
obj2[“length”]
obj2.length
中所示,但从
“ttt”
对象借用的只是属性的名称。这与作为对象上的方法的函数不同。它们是可执行代码,作为上下文传递
.call()
允许您使用
.call()
执行任何函数(无论是否为方法)并指定
的值。这就是为什么您可以在一个对象上获取一个方法,并在另一个对象的上下文中调用它。但是,普通(非函数)属性不具备这种功能。在不同的上下文中没有什么可以“执行”的。该属性只有一个名称和一个值。您可以在任何其他对象上使用该名称,但没有代码可以在该属性的不同上下文中执行

此外,请记住,一旦检索到
“ttt”.length,此时您所拥有的只是一个数字。这个数字没有关于它来自哪里的上下文,因此实际上没有任何方法将生成该数字的逻辑应用于其他对象


至于
.call()
,它是
函数
对象的一种方法。因此,您只能将其与函数一起使用。这就是为什么它可以与
.charAt()
方法配合使用,因为这是一个函数

但是
.length
属性不是函数(它返回一个数字),因此它没有
.call()
方法。这就是为什么你所尝试的不起作用

因为
.length
不是一个函数,所以您不能像使用
.charAt()
时那样将其背后的功能任意应用于另一个对象。非函数不支持这一点

当然,您可以只使用其他字符串中已有的
.length
属性,如中所示:

console.log("defgh".length);
如果你能描述你真正想要完成的事情,我们可能会提供一种不同的方式来完成它,这是受支持的,但是你目前对你正在尝试做的事情的描述似乎并不符合逻辑,因此很难弄清楚你正在试图解决的实际问题是什么


仅供参考,也没有理由这么做:

"abc".charAt.call("defgh",1);
您还可以执行更直接的方案,对所需对象调用方法:

"defgh".charAt(1);   // "e"

在JS中,这在技术上是不可能的,因为在计算了
“abc”.length
表达式之后,属性名丢失(并且只有值被带到下一个),因此不能将其重新应用到另一个上下文

因此,即使您扩展了原始类型包装器原型,您仍然无法提取除值之外的其他内容

因此,它不符合当前的语言规范。

调用和应用的目的是在函数调用中设置this对象。它们是作为没有该方法的对象的方法调用函数所必需的。但是,需要注意的是,函数可以使用以此方式提供的对象

将该原理应用于属性意味着尝试读取一个没有属性的对象的属性,使用算法从另一个有属性的对象读取属性

如果考虑许多对象具有的长度属性,则对于每个类型的对象,确定它的算法是不同的:

  • 字符串:字符数someArray.join('').length;