为什么要在JavaScript对象中使用公共方法?

24

我是工作中一个小研究组的一员,正在试图更好地理解JavaScript的工作原理。在我们最近关于对象的讨论中,我们了解到一个对象的公共方法在每次实例化对象时都会重新创建,而分配给对象原型的方法只会被创建一次并继承所有实例。据我所知,公共方法和分配给原型的方法都是公开可访问的。

那么我想问的问题是:如果添加到原型显然更有效率,为什么还要创建公共方法呢?公共方法提供了什么样的优势,而原型则没有呢?


原型添加到对象会为同一类的其他对象(在本例中是函数)创建相同的方法。例如,如果我有var name = new Student()并且我向name添加了一个原型,那么它也将对var name2 = new Student()可用。 - Akshay Khandelwal
1
假设OP的意思是在“Student”的构造函数内执行this.GetName = function() { ... },那么你可以从两个地方访问它,但是它会“每次重新创建”。 - James Thorpe
@Pablo 不对。我不同意。这不是重复的。他指出的区别肯定有道理,因为它涉及到公共方法的再次创建。 - Akshay Khandelwal
@AkshayKhandelwal他指出,每次实例化一个新对象时,公共方法都会被重新创建。问题的最后两行是关键。 - Pablo Lozano
@Pablo,我认为你提供的第二个问题符合我的需求。这让我感到沮丧,因为我总是在发布之前搜索StackOverflow-我尽量避免重复!感谢您指向两者,我会仔细阅读它们。 - AurumPotabile
1个回答

24

具体回答如下:

公共方法提供的好处是什么,原型没有提供什么好处?

在构造函数中添加的方法可以访问私有信息,例如:

function Student() {
    var name = 'Bob';
    this.GetName = function() {
        return name;
    }
}

Student.prototype.SomeOtherPublicMethod = function() {
    //no access to name
}

这有道理,@James Thorpe。 - AurumPotabile
@Kroltan 我很想看看你如何构建这样一个东西,其中原型方法可以访问私有变量,但对象的每个实例都有自己的数据。(真心实意,没有讽刺...!) - James Thorpe
@JamesThorpe 不要理会我的评论,我没有完全注意细节。但现在我很感兴趣,会尝试去做! - Kroltan
1
如果你想称它们为特权方法,那么不 - 它们与在构造函数中定义的公共方法之间没有区别。使它们成为“特权”方法的是它们能够访问内部,而不是它们确实这样做。 - James Thorpe
1
@AurumPotabile 不,这只是一个通常用来指代它们的名称。你试图将这些关键词强加到一个没有这些关键词的语言上。"private"、"public"(和"privileged")这些关键词被给予你,因为你可能熟悉它们,但它们在JS中并不存在。它们可以让你入门,但要深入理解,需要思考JS的核心原则,如函数作用域、闭包/iifes等,这才是事物存在的真正原因。这是比其他语言的关键词更健康的知识基础。 - null
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接