【问题标题】:Why does constructor property return entire block of class?为什么构造函数属性返回整个类块?
【发布时间】:2019-08-19 16:12:24
【问题描述】:

为什么类实例的构造函数属性包含整个类的主体,而不仅仅是构造函数?

// given: 
class C {
  constructor() {
    this.data = 'some data'
  }
  fn() {
    console.log('in fn')
  }
}
const c = new C()

c.__proto__.constructor
// returns
// class C {
//   constructor() {
//     this.data = 'some data'
//   }
//   fn() {
//     console.log('in fn')
//   }
// }

Object.getPrototypeOf(c).constructor
// returns
// class C {
//   constructor() {
//     this.data = 'some data'
//   }
//   fn() {
//     console.log('in fn')
//   }
// }

c.constructor
// returns 
// class C {
//   constructor() {
//     this.name = 'some data'
//   }
//   fn() {
//     console.log('in fn')
//   }
// }

我认为它只会返回实际的构造函数。据我了解,在 ES2015 之前,在扩展“类”之后,构造函数将被重置为子类的函数体,例如:

function Parent() { console.log('function body parent') }
function Child() { console.log('function body child') }
Child.prototype = Object.create(Parent.prototype); 
Child.prototype.constructor = Child; // reset

但是,我在这里有点困惑,因为试图在这里查看构造函数只会让我得到 [native code]

Object.getPrototypeOf(Child).constructor
ƒ Function() { [native code] }

【问题讨论】:

    标签: javascript class ecmascript-6 constructor


    【解决方案1】:

    你是对的,在这两种情况下.constructor 只是指构造函数

    为什么类实例的构造函数属性包含整个类的主体,而不仅仅是构造函数?

    控制台试图帮助你,如果你告诉它记录一个构造函数,它也会显示原型的方法。 (它可能会使用一些内部属性来确定该函数是否是使用class 创建的,并据此以不同方式显示该函数)。如果您在使用class创建的构造函数上调用Function#toString(),您可以观察到相同的行为。

    我在这里有点困惑,因为试图在这里查看构造函数只会让我得到 [native code]

    Object.getPrototypeOf(Child) 让您感到困惑,因为您在构造函数本身而不是在实例上调用它。并且 * 构造函数* 直接继承自 Function,除非它是使用 class 创建的子类,否则会发生一些神奇的事情来设置 prototype(而不是 .prototypeproperty ) 的 * 构造函数* 到 超类构造函数 (继承静态属性)。

    【讨论】:

    • 谢谢。 Object.getPrototypeOf(Child) 让您感到困惑,因为您在构造函数本身而不是实例上调用它。 如果我理解正确,我在这里所做的是调用 Parent 类的构造函数 好像它是一个静态方法,例如Parent.constructor()。这是正确的吗?
    • 实际上,在设置原型后将构造函数设置回扩展子类的构造函数时,.constructor 方法的使用超出了我在“ES2015 之前”示例中使用的方法。我相信这是我见过它使用的唯一地方。
    • 没有。使用getPrototypeOf(Child),除了getPrototypeOf,您什么都没有调用。
    • .constructorproperty 可以在实例上/在实例中使用来引用构造它的函数,否则将无法从实例返回构造函数跨度>
    • 啊,第一个评论实际上应该是Object.getPrototypeOf(Child).constructor,抱歉是引用,忘记添加解释实际问题的步骤
    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2019-02-27
    相关资源
    最近更新 更多