Javascript Object.getPrototypeOf与_proto之间的差异__

Javascript Object.getPrototypeOf与_proto之间的差异__,javascript,Javascript,我知道后者是不标准的。但是Object.getPrototypeOf和\uuuuuuuuuuuuu之间有区别吗?我正在研究javascript中的原型链是如何工作的,我想在这一部分讲清楚 谢谢。发件人: getPrototypeOf()是旧的和不推荐使用的对象的标准实现。_proto_____属性。但是,它是一种只读方法 因此,如果您正在读取值,它们基本上完成相同的任务,除了\uuuuu proto\uuuu是非标准的\uuuu proto\uuuu还可能允许您设置现有对象的原型,但通常这不是一

我知道后者是不标准的。但是
Object.getPrototypeOf
\uuuuuuuuuuuuu
之间有区别吗?我正在研究javascript中的原型链是如何工作的,我想在这一部分讲清楚

谢谢。

发件人:

getPrototypeOf()是旧的和不推荐使用的对象的标准实现。_proto_____属性。但是,它是一种只读方法


因此,如果您正在读取值,它们基本上完成相同的任务,除了
\uuuuu proto\uuuu
是非标准的
\uuuu proto\uuuu
还可能允许您设置现有对象的原型,但通常这不是一个好主意,因此现在的标准是使用构造函数或
对象。create
创建具有特定原型的对象。也就是说,ES6规范还定义了一个
setPrototypeOf
,用于设置对象的原型,尽管出于性能原因,最好避免这样做,除非有明确的必要。

最初,在早期版本的Mozilla浏览器(Firefox 3.5之前)中,
\uPrototypeof
是仅针对Mozilla的黑客攻击。直到2008年,它才被编入ECMAScript 3.1

一个区别是,
\uuuuu proto\uuuuu
可以更改(尽管这是一种糟糕的设计实践),而
getPrototypeOf
是一个读取函数

var parentObject = {"parentKey" : "parentValue"};
var childObject = {"childKey" : "childValue"};
childObject.__proto__ = parentObject;
console.log(childObject.parentKey); // parentValue
Object.getPrototypeOf(childObject) = {"parentKey" : "newValue"};
// ReferenceError: Invalid left-hand side in assignment
另一个区别是它们如何处理不太可能发生的名称冲突:

var myObject = { __proto__ : "conflicts", getPrototypeOf : function () {return "does not conflict"} };
console.log( myObject.getPrototypeOf() ); // "does not conflict"
// all objects inherit from Object.prototype, not Object, so there is no conflict
console.log( Object.getPrototypeOf(myObject) ) // Object {}
console.log( myObject.__proto__ ); // Object {}, the value "conflicts" is lost
治疗&Lt__原型≫作为:

-及≪getPrototypeOf≫作为:

总结: 在javascript中,对象的
\uuu proto\uuu
属性和
对象.getPrototypeOf()
方法都是访问对象原型的方法。它们都为我们提供了原型属性的参考

那有什么区别呢

因为
\uuuu proto\uuuu
只是对象的一个属性,并且在当天被放在那里以访问对象的原型
\uuuu proto\uuuu
现在已被弃用,某些JS引擎可能不再支持此属性
Object.getPrototypeOf()
Object.setPrototypeOf()
是现在应该用来检索原型的函数

例子:
功能狗(名称){
this.name=名称;
}
Dog.prototype.bark=函数(){console.log('woof');};
let dog=新狗(‘fluffie’);
//不要:
//使用___; proto__;的旧方法已弃用!
console.log(dog.\uuuu proto\uuuuu);
//做:
//使用较新的getPrototypeOf函数
log(Object.getPrototypeOf(dog));
//像这样爬上原型链怎么样?
控制台日志(dog.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu);
//我们可以简单地嵌套Object.getPrototypeOf()方法调用,如下所示:
console.log(Object.getPrototypeOf(Object.getPrototypeOf(dog))
最后一段是错误的,因为您感到困惑。对象的原型具有
isPrototypeOf
prop。不
getPrototypeOf
<代码>对象是一个函数,不是对象的原型。代码的第一行应该写
isPrototypeOf
,而不是
getPrototypeOf
,换句话说,最后一段中的答案不是回答这个问题,而是另一个问题。
_ = new Proxy({}, {
  get:z=>console.log('a'),
  getPrototypeOf:z=>console.log('b'),
});
_.__proto__/*a*/
_ = new Proxy({}, {
  get:z=>console.log('a'),
  getPrototypeOf:z=>console.log('b'),
});
Object.getPrototypeOf(_)/*b*/