Javascript 实例属性是否会模糊原型链?

Javascript 实例属性是否会模糊原型链?,javascript,underscore.js,Javascript,Underscore.js,片段A var instance = []; Array.prototype.forEach = function () {var prototyped_version;} instance.forEach = function () {var property_version}; 在代码段A中,如果我将属性添加到实例变量instance,并意外地重写了一个原型方法(在本例中为forEach),则在执行时将实际调用哪个方法: instance.forEach() 原型版本还是属性版

片段A

var instance = [];

Array.prototype.forEach = function () {var prototyped_version;}

instance.forEach = function () {var property_version};   
在代码段A中,如果我将属性添加到实例变量
instance
,并意外地重写了一个原型方法(在本例中为
forEach
),则在执行时将实际调用哪个方法:

instance.forEach()
原型版本还是属性版本

我正试图弄明白为什么要进行复杂的类型检查,特别是这一行:

if (nativeForEach && obj.forEach === nativeForEach) {
为什么不只是:

if (obj.forEach) {

由于
obj
已被验证为不为
null
undefined

我发现这将重写原型版本。即使在属性指定之后指定了原型版本

给你。记录函数将打印出来,您可以在控制台中检查它,并查看它是否为属性版本

小提琴代码:

var instance = [];

instance.forEach = function () {var property_version};

Array.prototype.forEach = function () {var prototyped_version;}

console.log(instance.forEach);

实例属性将重写原型方法。

我发现这将重写原型版本。即使在属性指定之后指定了原型版本

给你。记录函数将打印出来,您可以在控制台中检查它,并查看它是否为属性版本

小提琴代码:

var instance = [];

instance.forEach = function () {var property_version};

Array.prototype.forEach = function () {var prototyped_version;}

console.log(instance.forEach);

实例属性将覆盖原型方法。

“实际调用哪个方法”=>这很容易测试。你做了吗?将始终使用属性版本。在原型继承模型中,检查对象是否定义了属性,如果没有,则进入属性链。下划线检查
obj.forEach===nativeForEach
检查,以确保不仅
forEach
没有在此特定数组上重新定义,而且,对象的
forEach
与本机数组方法相同,如果对象不是数组(因此不继承自
Array.prototype
),则可能不是这种情况。“实际将调用哪种方法”=>这很容易测试。你做了吗?将始终使用属性版本。在原型继承模型中,检查对象是否定义了属性,如果没有,则进入属性链。下划线检查
obj.forEach===nativeForEach
检查,以确保不仅
forEach
没有在此特定数组上重新定义,而且,该对象的
forEach
与本机数组方法相同,如果该对象不是数组(因此不继承自
Array.prototype
),则可能不是这种情况。它不会覆盖它,只是具有更高的优先级。在考虑原型之前,JavaScript将首先检查对象实例上的函数。关于原型如何在JavaScript中工作,几乎没有更基本的内容。它不会覆盖它,只是具有更高的优先级。在考虑原型之前,JavaScript将首先检查对象实例上的函数。