gpt4 book ai didi

javascript - js中这两种方法表示有什么区别

转载 作者:行者123 更新时间:2023-11-29 20:18:13 24 4
gpt4 key购买 nike

我正在开发一个网站。我得出的结论是,我需要为我的 javascript 代码构建一个稍微复杂一些的框架。我已经开始研究如何编写 javascript 库的不同示例。我想出了一些令人困惑的方法来写下方法。我真的很感激一些澄清。

所以我通常会这样写一个方法:

var ReportEnhancements =
function () {
this.Name = function()
{
alert('It is me!');
}
}

这是表示方法的另一种方式:

 ReportEnhancements.prototype.Tooltip = {
setByTitle :function(elementsToTooltip) {
alert('I am about to be tooltiped!')
}
}

有两件事让我很困惑:

  1. 什么时候应该使用原型(prototype)关键字?我什么时候应该只将方法声明为成员的名字?
  2. 看看 setByTitle 和 Name,如您所见,它们是不同的,尽管它们都声明了方法并且两个方法都是公共(public)的。
  3. 为什么 this.Name = function() 和 setByTitle :function() 之间有区别。为什么有两种不同的语法来声明方法?

编辑:

我越来越了解其中的差异,但还有一个大问题我还没有完全掌握。为什么要用这两种方式来表示方法,从而使类有两种不同的访问规则。我似乎无法在 javascript 对象文字中声明私有(private)方法。另一方面,如果我有一个常规的嵌套元素,我似乎无法将其公开为公共(public)修饰符。访问修饰符有什么问题?

谢谢!

最佳答案

一个显着的区别(虽然这没有回答为什么哪个是首选)是范围。

在前者中,this.Name() 可以访问外部函数中声明的任何其他变量,因为它都是一个闭包。它被称为“特权方法”。

后一个版本,完全在原始范围之外声明,无法访问那些“私有(private)”成员变量。

从技术上讲,后者实际上内存效率更高,因为该函数只创建一次。在第一个版本中,每次实例化该类型的对象时都会重新创建内部函数。如果你只有几个这样的对象,那没关系,但如果你要创建数百个,那么你真的应该使用基于 prototype 的方法。

编辑 - 关于您对访问修饰符的编辑:

嗯,实际上根本没有访问修改

前一种方法创建了一个“闭包”,闭包可以包含变量声明,其范围仅限于本地。然而,函数也是一个对象,因此向 this 添加属性会将这些属性暴露给外界。 “导出”方法或变量的常用方法是这样做:

var MyType = function() {
var method = function() { ... }; // this is private variable

this.method = method; // this is a public property pointing
}; // to the private variable

另一方面,后一种带有对象字面量的方法不会创建闭包,它只是一堆命名属性,其恰好包含函数引用。

对象的所有属性都可以从外部访问,因此使用对象文字创建的所有内容都是隐式“公共(public)”的。

关于javascript - js中这两种方法表示有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5326367/

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