Object.getPrototypeOf与__proto__之间的区别

时间:2013-07-20 05:38:06

标签: javascript

我知道后者是非标准的。但Object.getPrototypeOf__proto__之间是否存在差异?我正在调查javascript中的原型链是如何工作的,并希望在这一部分上清楚。

感谢。

3 个答案:

答案 0 :(得分:13)

来自MDN

  

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

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

答案 1 :(得分:7)

最初,__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

答案 2 :(得分: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)))