Object.getPrototypeOf与__proto__之间的区别

sim*_*ack 12 javascript

我知道后者是非标准的.但是Object.getPrototypeOfvs 之间有区别__proto__吗?我正在调查javascript中的原型链如何工作,并希望在这一部分清楚.

谢谢.

log*_*yth 14

来自MDN:

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

因此,如果您正在阅读该值,他们基本上会完成同样的事情,除非__proto__是非标准的.__proto__也可能让你设置一个现有对象的原型,但通常这不是一个好主意,所以现在的标准是使用构造函数或Object.create创建一个具有特定原型的对象.也就是说,ES6规范也定义了一个setPrototypeOf用于设置对象原型的方法,尽管出于性能原因,除非明确需要,否则最好避免使用它.


Ily*_*mov 8

最初,__proto__Mozilla浏览器的早期版本(3.5之前的Firefox)是Mozilla唯一的黑客攻击.它仅在2008年在ECMAScript 3.1中编纂.

一个区别是__proto__可以改变(虽然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
Run Code Online (Sandbox Code Playgroud)

另一个区别是他们如何处理名称冲突的不太可能的情况:

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
Run Code Online (Sandbox Code Playgroud)

  • 最后一段是错误的,因为 **你很困惑。** 对象的原型有 `isPrototypeOf` 属性。**不是** `getPrototypeOf`。“Object”是一个函数,并且**不是**对象的原型。¶ 代码的第一行应该写 `isPrototypeOf` 而不是 `getPrototypeOf`,换句话说,你在最后一段中的答案不是回答这个问题,而是回答另一个问题。 (2认同)

Pac*_*ier 5

Proxy将 ≪__proto__≫ 视为get

_ = new Proxy({}, {
  get:z=>console.log('a'),
  getPrototypeOf:z=>console.log('b'),
});
_.__proto__/*a*/
Run Code Online (Sandbox Code Playgroud)

- 和 <getPrototypeOf> 作为getPrototypeOf

_ = new Proxy({}, {
  get:z=>console.log('a'),
  getPrototypeOf:z=>console.log('b'),
});
Object.getPrototypeOf(_)/*b*/
Run Code Online (Sandbox Code Playgroud)