【问题标题】:In Javascript, why Object.getPrototypeOf(person) works but person.getPrototypeOf(person) won't?在 Javascript 中,为什么 Object.getPrototypeOf(person) 有效但 person.getPrototypeOf(person) 无效?
【发布时间】:2012-09-21 14:57:51
【问题描述】:

对于下面的代码,我想知道为什么Object.getPrototypeOf(person) 可以工作,而person.getPrototypeOf(person) 不能工作?我认为规则是:如果对象没有这样的属性或方法,它会沿着原型链尝试获取它,并在this上调用它(例如Animal.getName.call(this),其中this是woofie 对象的上下文)。那么在这种情况下,person.getPrototypeOf(person) 应该变成 Object.getPrototypeOf.call(person, person) 并且也应该工作?

function Person(name) {
    this.name = name;
}

var person = new Person("Ang Lee")

console.log("the prototype of person is", Object.getPrototypeOf(person));

更新:对于说getPrototypeOf 是静态方法的答案,这是否意味着:

function Person(name) {
    this.name = name;
    this.foo = function() { ... }
}

Person.bar = function() { ... }

foo 是“链中的”,可以被任何继承的对象调用,而bar 不是,bar 就像getPrototypeOf,这是一个静态方法?

【问题讨论】:

标签: javascript prototype


【解决方案1】:

Object.getPrototypeOf 是 Object type 本身的属性,而不是 Object 的 prototype 的属性。

因为它实际上不在原型链中,所以调用person.getProtoTypeOf()时是找不到的。

它更类似于在其他 OO 语言中看到的“静态方法”。

【讨论】:

  • 你认为更新中的问题是正确的吗? (这是定义静态方法的唯一方式吗?)
  • 是的,您在更新中描述的内容或多或少是正确的。 Person.bar 是静态方法,.foo 是实例方法。但是,您编写 foo 的方式不是在原型链上,因为它仅在创建时绑定到每个实例,而不是添加到 Person.prototype。
【解决方案2】:

.getPrototypeOf 是一个放在Object 上的函数,而不是它的原型。如果你愿意,你可以查一下:

"getPrototypeOf" in Object.prototype; // false

【讨论】:

    【解决方案3】:

    如果getPrototypeOf是Object.prototype中包含的一个方法,它也可以在Person类型的对象上使用,但是getPrototypeOf附加到Object,这只是@987654327的构造函数@ 实例,而不是原型。

    出于某种原因,Javascript 的创建者决定将原型附加到构造函数,反之亦然;如果他们没有做出这样有问题的决定,你就不必问这个问题。

    附:任何对基于原型的对象继承的更优雅/干净的实现感兴趣的人都可以查看http://iolanguage.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 2022-01-12
      • 2020-05-14
      相关资源
      最近更新 更多