私有子方法的原型

2024-04-14

我的代码如下所示:

var baseClass = function() {
// CODE
    var subClass = function() {
        // MORE CODE
    }
}

向baseClass添加方法就可以了,我只是使用

baseClass.prototype.newMethod = function () {
    // NEW CODE
}

我的问题是如何向子类添加方法?使其成为公共方法的唯一方法吗?

######## EDIT ##############

好的,我重新排列了代码,使子类位于基类之外。我传入baseClass,以便子类仍然可以访问baseClass实例的属性。

var baseClass = function() {
    var base = this;
    this.property_a = 1;
    this.property_b = 5;

    var sub = new subClass(base);
    // CODE
}

var subClass = function(parent) {
    var sub = this;
    this.property_c = 1;
    this.method_a = function() {
        return sub.property_c + parent.property_a;
    }
    // MORE CODE
}

这很好并且有效,但是现在我遇到了一个新问题,即当我使用原型添加方法时:

subClass.prototype.method_b = function(){
    return sub.property_c + parent.property_b;
}

我收到一条错误消息,说父级未定义。

基本上我有一个相当简单的 Web 应用程序,它有两个侧面:查看侧面和编辑侧面。我构建了基类,其中包括查看所需的所有内容,并且我想添加在不同文件中编辑所需的方法,以便仅当用户位于编辑页面时才加载它们。


为什么要在基类中声明该子类?对我来说没有意义。

您可以将子类的原型添加到您范围内的任何位置。在你的代码中它将是

var baseClass = function() {
// CODE
    var subClass = function() {
        // MORE CODE
    }
    subClass.prototype = {
        ...
    }
}

但我建议将其放在基类构造函数之外。如果您出于某种原因希望它是私有的,请添加一个闭包:

(function(){

    baseClass = function() { // public
        // CODE
    }
    baseClass.prototype = {...};

    var subClass = function() { // private
        // MORE CODE
    }
    subClass.prototype = Object.create(baseClass.prototype);
    subClass.prototype.newMethod = function () { ... }
})()

编辑回答扩展问题:

啊,subClass 不是继承自 baseClass!我们已经预料到了这一点,否则将它放在构造函数中可能没问题。然后,可以将相同的原型添加到每个不同的子类构造函数中:

var subproto = {
    method_b: = function(){
        // manipulate "this"
    },
    ...
};
function baseClass() {
    // some code
    function sub() {
        // is a constructor for subs which belong to this specif base intance
        ...
    }
    sub.prototype = subproto; // the sub constructors of each base instance
                              // have the same prototype
    var x = new sub(),
        y = new sub(); // example usage of the sub constructor
}
baseClass.prototype = {...}

另外,如果您想要一个通用的子构造函数(在函数 baseClass 之外),您可以将子所属的基实例作为构造函数的参数 - 就像您所做的那样。当然,子(内部和外部方法)只能访问该基实例的公共属性。

您在重新排列的代码中犯的错误是您的原型(“外部”)方法尝试访问私有parent来自子构造函数的变量。正如您所说,“错误说父级未定义”。

var subClass = function(parent) {
    var sub = this;
    this.parent = parent; // make it public
    this.property_c = 1;
    this.method_a = function() {
        return sub.property_c + parent.property_a;
    }
    // MORE CODE
}
subClass.prototype.method_b = function(){
    // prototype functions can only access public properties
    // i.e. privileged methods, public attributes and other prototype properties
    return this.property_c + this.parent.property_b;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

私有子方法的原型 的相关文章

随机推荐

  • 在接到电话时将应用程序置于最前面

    当我接到电话时 我想将我的应用程序带到电话接听屏幕前面 我在接到电话后完成了所有编码部分 但该应用程序并没有出现在前面 它刚刚打开并停留在电话应答屏幕下方 我想将我的应用程序带到此屏幕前面 我做了如下的事情 Intent i new Int
  • 如何在 Swift 3 中为在 for 循环期间修改的数组编写 for 循环?

    所以 我有一个与此类似的 for 循环 for var i 0 i lt results count i 1 if results i lt 5 results removeAtIndex i i 1 这曾经有效 但是当我将其更改为首选 S
  • 什么是 CLR 类?

    我在 google 上搜索了 CLR 并从 wikipedia 找到了它是什么 但我想知道 CLR 类或更具体地说 CLR 实体类型是什么 尤其是在 ASP NET 中 CLR 不是类 公共语言运行时 CLR 是 Microsoft NET
  • Blob.generate_signed_url() 失败 AttributeError

    因此 我尝试使用以下方法为我的 Google Cloud Storage 对象生成临时的全局可读 URLgoogle cloud storagePython 库 https googlecloudplatform github io goo
  • CSS“ch”单元的意外行为

    我正在使用ch用于指定宽度的 CSS 单位div包含文本 我使用的是等宽字体 但是 如果我设置width 80ch 我第一个得到 80 个字符n行 其中n始终是 24 不确定这是否重要 但从那时起只有 79 个字符 这如下面的屏幕截图所示
  • PyCharm 和 reStructuredText (Sphinx) 文档弹出窗口

    让我们想象一下 我想看到一个简单方法的文档字符串弹出窗口PyCharm4 5 社区版 也在 5 0 中尝试过 我在两个文件中都写下了这些文档字符串epytext语法 自 2008 年起不再支持 Epydoc 生成器 并且仅适用于 Pytho
  • 无法以编程方式减小 gtk 窗口的大小

    以编程方式调整 gtk 窗口大小时 我似乎遇到了问题 问题是 一旦我将窗口的宽度和高度增加到 800x600 我似乎无法将其缩小回原来的大小 400x200 下面是示例代码 有人遇到过这样的问题吗 include
  • Selenium IDE - 导出测试脚本

    我正在尝试导出在 Selenium IDE 中创建的测试自动化 但找不到导出选项 我有一些测试场景 其中测试是相同的 但我需要复制现有测试并交换一些 ID 才能使其正常工作 我只能将其保存为 side 文件 而不能保存为 Selenium
  • glutTimerFunc问题

    I use Glut制作一个简单的动画 在主函数中 glutTimerFunc TIMERMSECS animate 0 叫做 这两段代码生成相同的图形 const int TIMERMSECS 20 float animation tim
  • 删除android进度条中的进度条背景

    如何去掉灰色背景 只在进度条中显示蓝色进度条 我已经回答过一个有类似要求的问题 Result 要删除它 简单地通过 id 搜索背景并尝试隐藏它是行不通的 要删除背景 我必须创建与系统版本相同的绘图并删除背景项目 TL DR 创建文件prog
  • 如何确保 Data.Vector 的摊销 O(n) 级联?

    我有一个应用程序 在其中使用向量作为代码的一部分是有效的 然而 在计算过程中我需要跟踪一些元素 我听说你可以从 Data Vectors 获得 O n 摊销串联 通过通常的数组增长技巧 但我认为我做得不对 假设我们有以下设置 import
  • 循环遍历节点列表 JS

    我的问题是 我正在尝试通过 Hot 类的 NODELIST 我想将他们的 className 更改为 cool 当我使用 for 循环时 它的第二个 li 似乎没有改变颜色 有谁知道我在这里犯了什么错误 第二个 li 元素没有改变颜色 谢谢
  • 如何更改 NSPopover 背景颜色包括三角形部分?

    我该如何改变NSPopover背景颜色包括三角形部分吗 它实际上要简单得多 并且您不需要私有 API 使视图控制器的根视图成为自定义类 implementation MyPopoverRootView void viewDidMoveToW
  • 在 Python 中为方法生成控制流图的最简单方法是什么?

    我正在编写一个程序来尝试比较两种方法 我想为所有匹配的方法生成控制流图 CFG 并使用拓扑排序来比较两个图 有一个Python包叫做staticfg https pypi org project staticfg 它正是从一段 Python
  • 为什么不再需要指明ByVal/ByRef?

    我刚刚安装了 Visual Studio 2010 Service Pack 在 Windows Update 上建议 我可以看到 intellisense 上的一个新功能 这意味着当我编写Function or Sub在 VB NET 中
  • Linux 上的 JDK 1.8 缺少 JNI 包含文件

    我正在尝试编译以下项目 https github com entropia libsocket can java 我总是收到此错误消息 有谁知道如何修复它 这可能是 Linux x64 Debian Wheezy 上 JDK 1 8 0 1
  • 自定义类型.NamedTuple

    我在用着NamedTuples来保存数据 我想添加一个可以被多个继承的方法NamedTuple基础课程 但是当我尝试使用多重继承或子类化时NamedTuple基于类 它不起作用 具体来说 我试图自动为所有数据类提供一个方法 该方法可以查看类
  • 同一服务器实例和同一作业存储上的多个 Quartz 实例

    我们有 2 个使用quartz 进行调度的应用程序 我们应用程序的quartz properties如下 org quartz scheduler instanceName sr22QuartzScheduler org quartz sc
  • HighCharts:在一个系列中绘制多个段?

    我问自己是否可以做多条重叠的线 在一个系列中 我找不到任何例子 我不想要这个 Highcharts Highstock 阶梯线没有垂直 过渡 线 https stackoverflow com questions 23242857 high
  • 私有子方法的原型

    我的代码如下所示 var baseClass function CODE var subClass function MORE CODE 向baseClass添加方法就可以了 我只是使用 baseClass prototype newMet