javascript 为什么Object.isPrototypeOf在普通对象中不可用

js81xvg6  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(128)

我可以访问Object.getPrototypeOf方法,但为什么示例化的对象不能访问Object.getPrototypeOf方法?

const obj = {}
obj.getPrototypeOf // is not a function
mfpqipee

mfpqipee1#

它是一个静态方法,不能在示例上使用。
请尝试:

const myObj = Object.create({})

console.log(Object.getPrototypeOf(myObj))
7nbnzgx9

7nbnzgx92#

正如其他人所指出的,主要原因是它是Object构造函数上的静态方法,而不是示例或原型函数。所以正确的使用方法是const proto = Object.getPrototypeOf(theObject);。但请继续阅读,了解为什么您可能不想为此使用对象方法,即使它确实有一个。
对象确实有一个__proto__访问器属性**,但使用它是一个坏主意™**,因为A)对象可能没有它,¹和B)即使对象确实有它,它也可能对你撒谎,就像它可以使用原型方法hasOwnProperty检查对象是否有一个给定名称的“自己”属性一样。对象说谎的机会是远离将这些东西放在原型上的一个动机(沿着避免Web兼容性问题和提高JavaScript引擎性能)。最近,Object上添加了一个新的静态方法Object.hasOwn,专门用于替换原型函数hasOwnProperty。与getPrototypeOf一样,它是Object上的静态方法,而不是原型方法,它不会欺骗您。* (尽管有代理人反对。)*
因此,在那些罕见的情况下,您需要获得对象的原型,只需通过Object.getPrototypeOf(theObject)进行操作。
没有__proto__访问器属性的对象示例:

// 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;
}
3phpmpom

3phpmpom3#

因为它是一个静态方法(它应该用在类上,而不是示例上)
范例:

class X {
  static getX() {}
}

const x = new X()
// works
X.getX()
// throws
x.getX()

相关问题