我可以访问Object.getPrototypeOf方法,但为什么示例化的对象不能访问Object.getPrototypeOf方法?
Object.getPrototypeOf
const obj = {} obj.getPrototypeOf // is not a function
mfpqipee1#
它是一个静态方法,不能在示例上使用。请尝试:
const myObj = Object.create({}) console.log(Object.getPrototypeOf(myObj))
7nbnzgx92#
正如其他人所指出的,主要原因是它是Object构造函数上的静态方法,而不是示例或原型函数。所以正确的使用方法是const proto = Object.getPrototypeOf(theObject);。但请继续阅读,了解为什么您可能不想为此使用对象方法,即使它确实有一个。对象确实有一个__proto__访问器属性**,但使用它是一个坏主意™**,因为A)对象可能没有它,¹和B)即使对象确实有它,它也可能对你撒谎,就像它可以使用原型方法hasOwnProperty检查对象是否有一个给定名称的“自己”属性一样。对象说谎的机会是远离将这些东西放在原型上的一个动机(沿着避免Web兼容性问题和提高JavaScript引擎性能)。最近,Object上添加了一个新的静态方法Object.hasOwn,专门用于替换原型函数hasOwnProperty。与getPrototypeOf一样,它是Object上的静态方法,而不是原型方法,它不会欺骗您。* (尽管有代理人反对。)*因此,在那些罕见的情况下,您需要获得对象的原型,只需通过Object.getPrototypeOf(theObject)进行操作。没有__proto__访问器属性的对象示例:
Object
const proto = Object.getPrototypeOf(theObject);
__proto__
hasOwnProperty
Object.hasOwn
getPrototypeOf
Object.getPrototypeOf(theObject)
// A basic example of an object with no __proto__ accessor property: const o1 = Object.create(null); console.log("__proto__" in o1); // false console.log(o1.__proto__); // undefined console.log(Object.hasOwn(o1, "__proto__")); // false console.log(o1.__proto__); // undefined // Here's another one, and this one has a prototype const o2 = Object.create( Object.assign( Object.create(null), { method() { console.log("Hi there"); } } ) ); console.log("__proto__" in o2); // false console.log(o2.__proto__); // undefined console.log(Object.hasOwn(o2, "__proto__")); // false console.log(Object.hasOwn(o2, "method")); // false console.log("method" in o2); // true o2.method(); // "Hi there"
.as-console-wrapper { max-height: 100% !important; }
3phpmpom3#
因为它是一个静态方法(它应该用在类上,而不是示例上)范例:
class X { static getX() {} } const x = new X() // works X.getX() // throws x.getX()
3条答案
按热度按时间mfpqipee1#
它是一个静态方法,不能在示例上使用。
请尝试:
7nbnzgx92#
正如其他人所指出的,主要原因是它是
Object
构造函数上的静态方法,而不是示例或原型函数。所以正确的使用方法是const proto = Object.getPrototypeOf(theObject);
。但请继续阅读,了解为什么您可能不想为此使用对象方法,即使它确实有一个。对象确实有一个
__proto__
访问器属性**,但使用它是一个坏主意™**,因为A)对象可能没有它,¹和B)即使对象确实有它,它也可能对你撒谎,就像它可以使用原型方法hasOwnProperty
检查对象是否有一个给定名称的“自己”属性一样。对象说谎的机会是远离将这些东西放在原型上的一个动机(沿着避免Web兼容性问题和提高JavaScript引擎性能)。最近,Object
上添加了一个新的静态方法Object.hasOwn
,专门用于替换原型函数hasOwnProperty
。与getPrototypeOf
一样,它是Object
上的静态方法,而不是原型方法,它不会欺骗您。* (尽管有代理人反对。)*因此,在那些罕见的情况下,您需要获得对象的原型,只需通过
Object.getPrototypeOf(theObject)
进行操作。没有
__proto__
访问器属性的对象示例:3phpmpom3#
因为它是一个静态方法(它应该用在类上,而不是示例上)
范例: