我知道后者是非标准的.但是Object.getPrototypeOfvs 之间有区别__proto__吗?我正在调查javascript中的原型链如何工作,并希望在这一部分清楚.
谢谢.
最初,__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)
_ = 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)