【发布时间】:2021-07-21 12:50:30
【问题描述】:
function protoFunc(name) {
this.name;
this.getName = function () {
return this.name;
}
}
在这里我创建了一个构造函数。现在,这个构造函数有一个原型属性,其中包含一个对象,您可以在该对象上定义要继承的成员,即方法和属性。其中一个成员是“构造函数”属性,它指向函数本身。
那么,为什么在prototype属性内部和constructor属性内部都看不到我刚刚在函数内部创建的方法和属性?
我只看到这个:
arguments: null
caller: null
length: 1
name: "protoFunc"
prototype:
constructor: ƒ protoFunc(name)
__proto__: Object
__proto__: ƒ ()
我刚刚创建的方法在哪里?
【问题讨论】:
-
因为这些没有被添加到原型中。它们直接添加到每个实例中。
-
@VLAZ 好的,我可以再问你 3 个问题吗?为什么实例没有
prototype属性?该属性是否仅对constructors可用?另外,我知道,当我调用没有new关键字的函数时,我将其作为函数调用,而不是构造函数,因此如果它只有属性和方法,它会返回“未定义”,但为什么当我这样做时对于像String()或Number()这样的内置对象也是如此,为什么我会得到我在括号中添加的值?为什么它不再返回undefined?最后,默认的Object是一个类,还是只是一个函数构造函数? -
prototype仅适用于构造函数。构造函数将使用它来制作 more 项。所有构造的项目都获得构造函数的原型,并通过它访问方法和属性。实例可能有__proto__属性,但它(有点)已被弃用。可以使用Object.getPrototypeOf(obj)获取实例的原型链。 -
Number和String的实现方式不同。您可以实现类似的行为 - 有一些方法可以检查是否使用new调用了函数,例如new.target,然后您可以在未使用new调用时提供不同的return。 -
至于对象。你当然可以称它为一个类。它也是一个构造函数,但有点特殊,因为它在规范中并且通常是主机提供的。这意味着如果你想完全模仿它的功能,你需要阅读规范并做同样的事情。但它所做的动作并没有什么特别之处——它所做的任何事情都可以在 JS 中实现。
标签: javascript prototype