18

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

谢谢。

4

4 回答 4

22

来自MDN

Object.getPrototypeOf() 是旧的和已弃用的 object.__proto__ 属性的标准实现。但是,它是一种只读方法。

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

于 2013-07-20T05:44:12.327 回答
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

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

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
于 2013-07-20T06:32:34.177 回答
4

Proxy将 ≪__proto__≫ 视为get

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

— 和 ≪getPrototypeOf≫ 作为getPrototypeOf

_ = new Proxy({}, {
  get:z=>console.log('a'),
  getPrototypeOf:z=>console.log('b'),
});
Object.getPrototypeOf(_)/*b*/
于 2017-11-23T16:35:05.970 回答
0

概括:

在 javascript__proto__中,对象的属性和Object.getPrototypeOf()方法都是访问对象原型的方式。它们都使我们能够访问原型属性的引用

那有什么区别呢?

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

例子:

function Dog (name) {
  this.name = name;
}

Dog.prototype.bark = function () { console.log('woof'); };

let dog = new Dog('fluffie');

// DON'T:
// Old method using __proto__ deprecated!
console.log(dog.__proto__);

// DO:
// Using the newer getPrototypeOf function
console.log(Object.getPrototypeOf(dog));

// What about climbing up the prototype chain like this?
console.log(dog.__proto__.__proto__);

// We can simply nest the Object.getPrototypeOf() method calls like this:
console.log(Object.getPrototypeOf(Object.getPrototypeOf(dog)))

于 2018-09-19T16:54:42.660 回答