我知道后者是非标准的。Object.getPrototypeOf
但是vs之间有区别__proto__
吗?我正在研究 javascript 中的原型链是如何工作的,并希望在这部分清楚。
谢谢。
我知道后者是非标准的。Object.getPrototypeOf
但是vs之间有区别__proto__
吗?我正在研究 javascript 中的原型链是如何工作的,并希望在这部分清楚。
谢谢。
来自MDN:
Object.getPrototypeOf() 是旧的和已弃用的 object.__proto__ 属性的标准实现。但是,它是一种只读方法。
因此,如果您正在读取值,它们基本上会完成相同的事情,除非__proto__
是非标准的。__proto__
还可能允许您设置现有对象的原型,但通常这不是一个好主意,因此现在的标准是使用构造函数或Object.create
创建具有特定原型的对象。也就是说,ES6 规范还定义了setPrototypeOf
用于设置对象原型的 a,尽管出于性能原因,除非明确需要,否则最好避免这种情况。
最初,__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
_ = 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*/
在 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)))