gpt4 book ai didi

javascript - 为什么将成员添加到 Constructor 函数而不是 Prototype?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:36:31 25 4
gpt4 key购买 nike

为什么要向构造函数而不是原型(prototype)添加成员?

function foo() {
}

foo.prototype.isThereSayShoeSize = function() {
console.log(this.sayShoeSize);
}

foo.fooObject = {num: 100, shoeSize: 43}

foo.sayShoeSize = function() {
console.log(foo.fooObject.shoeSize)
}

var myFoo = new foo();

console.log(myFoo.sayShoeSize); //undefined
myFoo.isThereSayShoeSize() //undefined

成员不属于实例,也不在实例之间共享。因此,这些成员不能通过 instance.member 语法访问,也不能通过实例中的 this 关键字访问。

所以看起来添加到构造函数中的成员与类型无关。

我只能想到两种可能的解释。 1 通过将这些成员与类型分组来节省命名空间空间,如果它们与类型无关,这就没有多大意义。 2 它们是静态成员,可以在没有类型实例的情况下访问。如果有另一种类型的对象希望使用这些成员,这是有意义的。但是在我看到这种模式的上下文中,这些成员仅由它们所附加的类型的实例使用。因此,在这种情况下,它们与类型相关并且仅由类型的实例使用,那么为什么不将它们放在原型(prototype)中呢?

正如您可能会说的那样,我对此感到有点困惑。我想也许这种向构造函数添加成员的模式在我所看到的上下文中是不合适的,并且应该将成员添加到原型(prototype)中。但是你会称这些成员为静态成员吗​​?这种模式的主要用途是拥有可被它们所附加的类型和其他类型使用的成员吗?

最佳答案

当你这样做时:

function foo() {};
foo.fooObject = {num: 100, shoeSize: 43};

它类似于在 C++ 世界中设置一个类变量作为 foo.fooObject 对所有实例可用并且对所有实例都相同。这是一种设置全局变量的命名空间方式。正如您指出的那样,它们不是实例变量,因此只有在需要范围内的全局变量是所需结果时才应使用此技术。

关于javascript - 为什么将成员添加到 Constructor 函数而不是 Prototype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7209878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com