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