Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.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_Prototype Oriented - Fatal编程技术网

Javascript 原型链可以';无法获取对象()?

Javascript 原型链可以';无法获取对象()?,javascript,prototype-oriented,Javascript,Prototype Oriented,我读了一篇解释什么是原型链的文章 它说,如果我试图访问一个对象的属性,但它没有,javascript引擎将尝试它的.constructor.propotype。如果没有,请尝试.construtor.propotype.constructor.propotype。直到找到内置对象() 但我要测试一下: function a() {} b = new a(); 然后: 我得到一个空的对象 然后: 我得到一个空的对象 它循环。无论我调用多少个.constructor.prototype,它都找不到

我读了一篇解释什么是原型链的文章

它说,如果我试图访问一个对象的属性,但它没有,javascript引擎将尝试它的
.constructor.propotype
。如果没有,请尝试
.construtor.propotype.constructor.propotype
。直到找到内置对象()

但我要测试一下:

function a() {}
b = new a();
然后:

我得到一个空的
对象

然后:

我得到一个空的
对象


它循环。无论我调用多少个
.constructor.prototype
,它都找不到Object()。发生了什么?我是否误解了原型链

看来我问了一个愚蠢的问题

如果A是一个函数:

A.prototype.constructor==A

如果A不是函数:

A.标准属性中的原型


因此(在标准中)没有办法爬上原型链。

在JS OOP中,
构造函数
原型
属性是脆弱的,因为它们在执行继承时不是为您设置的。您应该手动设置/更改它们以实现继承。例如,请参见

它看起来像是你试图攀登原型链的方式(通过遍历
.constructor.prototype
)从未真正到达
对象
顶级原型,因为当你有
函数a(){}
时,正确的
构造函数
原型
属性并没有设置在。我甚至无法强迫他们到
a
;在Chrome中,我得到:

> function a(){}
undefined
> a.constructor.prototype
function Empty() {}
> a.constructor.prototype = Object.prototype
Object
> a.constructor.prototype
function Empty() {} // hmmmm, the assignment didn't take...
当然,运行时不需要这样做,因为它引用了每个对象的实际原型。也就是说,该语言不通过
.constructor.prototype
进行查找,而是在内部保存每个实例的原型。因此,如果您使用
。\uuuuu proto\uuuu
,而不是
.constructor.prototype
,您可以看到查找链是如何工作的:

function a(){}
b = new a();
b.__proto__ === Object.prototype; // false
b.__proto__.__proto__ === Object.prototype; // true since we reached the top of the prototype chain
需要注意的是,属性
\uuuu proto\uuu
从来都不是标准的,在ES5中,标准化的方式略有不同:

obj.__proto__ === Object.getPrototypeOf(obj);

这使得
。\uuuuuu proto\uuuuuuuuuuu
不推荐使用。

虽然我理解,但答案更详细,因此我应该接受它。
function a(){}
b = new a();
b.__proto__ === Object.prototype; // false
b.__proto__.__proto__ === Object.prototype; // true since we reached the top of the prototype chain
obj.__proto__ === Object.getPrototypeOf(obj);