Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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_Oop - Fatal编程技术网

为什么在扩展对象时需要JavaScript原型?

为什么在扩展对象时需要JavaScript原型?,javascript,oop,Javascript,Oop,很长时间我用JavaScript编写代码,使用jQuery、ReactJS和NodeJS服务器端(ExpressJS)。我学习了部分MDN和其他来源,但是有一个问题我找不到答案。 为什么遵循代码需要prototype对象的属性?为什么我不能直接从Array对象使用forEach?我的意思是,在OOP方面,如果Arrayclass扩展类包含forEach方法,我可以直接从Array实例化的对象调用它,我不需要使用反射查找基类,实例化它并从基类调用方法 Array.prototype.forEach

很长时间我用JavaScript编写代码,使用jQuery、ReactJS和NodeJS服务器端(ExpressJS)。我学习了部分MDN和其他来源,但是有一个问题我找不到答案。
为什么遵循代码需要
prototype
对象的属性?为什么我不能直接从
Array
对象使用
forEach
?我的意思是,在OOP方面,如果
Array
class扩展类包含
forEach
方法,我可以直接从
Array
实例化的对象调用它,我不需要使用反射查找基类,实例化它并从基类调用方法

Array.prototype.forEach.call(document.querySelectorAll('.klasses'), function(el){
    el.addEventListener('click', someFunction);
});
示例如下:

您的代码:

Array.prototype.forEach.call(document.querySelectorAll('.klasses'), function(el){
    el.addEventListener('click', someFunction);
});
确实可以写成

[].forEach.call(document.querySelectorAll('.klasses'), function(el){
    el.addEventListener('click', someFunction);
});
遍历Array prototype对象只是访问任何数组实例可用的函数的一种方式,而无需实际创建数组。使用一种或另一种主要取决于偏好,尽管第二种形式涉及创建数组对象,但对性能的影响很小。

您的代码:

Array.prototype.forEach.call(document.querySelectorAll('.klasses'), function(el){
    el.addEventListener('click', someFunction);
});
确实可以写成

[].forEach.call(document.querySelectorAll('.klasses'), function(el){
    el.addEventListener('click', someFunction);
});
遍历Array prototype对象只是访问任何数组实例可用的函数的一种方式,而无需实际创建数组。使用一个或另一个主要取决于偏好,尽管第二种形式确实涉及创建数组对象,但性能影响很小

为什么我不能直接从数组对象使用forEach

数组对象是用于创建数组的构造函数。它没有自己的
forEach
属性

您可以从数组实例访问
forEach
属性(您可以使用
new Array
或更惯用的方法,使用
[]
创建该属性),或者通过访问应用于数组实例的
原型

为什么我不能直接从数组对象使用forEach

数组对象是用于创建数组的构造函数。它没有自己的
forEach
属性


您可以从数组实例访问
forEach
属性(您可以使用
new Array
或更惯用的方法,使用
[]
创建该属性),也可以通过访问应用于数组实例的
prototype
来访问该属性。

queryselect all
不返回数组,返回一个
节点列表(类似于数组对象)。节点列表有一个名为
.length
的属性,该属性指示节点列表中元素的计数

某些浏览器/引擎/后端技术不兼容,因为
NodeList
不需要提供功能
forEach

因此,另一种方法是使用阵列原型将
节点列表
转换为阵列:

Array.prototype.forEach.call(document.querySelectorAll('.klasses'), function(el){...})
或者,您可以使用函数
数组。从
将使用属性
.length
创建数组:

Array.from(document.querySelectorAll('.klasses'));
来自MDN文档 尽管NodeList不是数组,但可以使用
forEach()
对其进行迭代。一些较旧的浏览器尚未实现此方法。您还可以使用
Array.from
将其转换为数组


querySelectorAll
不返回数组,而是返回一个
NodeList
(类似于数组对象)。节点列表有一个名为
.length
的属性,该属性指示节点列表中元素的计数

某些浏览器/引擎/后端技术不兼容,因为
NodeList
不需要提供功能
forEach

因此,另一种方法是使用阵列原型将
节点列表
转换为阵列:

Array.prototype.forEach.call(document.querySelectorAll('.klasses'), function(el){...})
或者,您可以使用函数
数组。从
将使用属性
.length
创建数组:

Array.from(document.querySelectorAll('.klasses'));
来自MDN文档 尽管NodeList不是数组,但可以使用
forEach()
对其进行迭代。一些较旧的浏览器尚未实现此方法。您还可以使用
Array.from
将其转换为数组



较旧的浏览器没有forEach-on-DOM元素,事实上我认为IE11甚至没有forEach-on-DOM元素。。ps.DOM元素不是数组。
querySelectorAll
不返回数组。它返回一个类似数组的对象,一个节点列表。如果我使用数组作为
调用
的第一个参数,我可以命令
原型
?否-
调用
的第一个参数必须是你希望迭代的节点集。不要为代码操心,它已经过时了。您将为(document.queryselectoral('.klasses'))el.addEventListener('click',someFunction)编写
今天。旧浏览器在DOM元素上没有forEach,事实上我认为IE11甚至在DOM元素上没有forEach。。ps.DOM元素不是数组。
querySelectorAll
不返回数组。它返回一个类似数组的对象,一个节点列表。如果我使用数组作为
调用
的第一个参数,我可以命令
原型
?否-
调用
的第一个参数必须是你希望迭代的节点集。不要为代码操心,它已经过时了。您将为(document.queryselectoral('.klasses'))el.addEventListener('click',someFunction)编写
今天。是否创建新阵列?塞里厄斯?@Ele我不明白你的问题
[]
创建一个新数组,是的,如果您是这样要求的话。\n现代JavaScript运行时完全有可能跳过该数组的实例化,或者至少是可以想象的。是的,创建一个新数组不仅仅是为了访问该函数。因此,正如我所看到的,
prototype
i类似于静态访问方法或实例化对象并访问它的方法。好的,Thanx.创建一个新数组?塞里厄斯?@Ele我不明白你的问题<代码>