如何在 javascript 中实现 C# 访问修饰符?

2023-12-24

  • Summary

    我尝试在 javascript 中正确实现继承和封装,就像在基于类的语言(例如 c#)中一样。

    丑陋的部分是受保护的成员在私有实例中有多个副本,这些副本只能通过闭包访问,除了将这些成员刷新到私有实例之外我没有任何想法。

    如果可以的话我想把两者都摆脱掉transmit and transfer在我的代码中Function.extend.

  • Update对于有兴趣引用或研究的人,这里是源代码存储库:

    https://github.com/kenkins/Function.extend https://github.com/kenkins/Function.extend

  • 故事

    Since 组件可能是一个超出了javascript范围的概念,我不接受internal考虑到修改器,但是public, protected and private.

    public and private修饰符并不难实现;但有了继承,protected非常棘手。然而,我读过的大多数文章都说,这不是推荐使用 javascript 做的事情带有特殊字符的前缀并记录它.

    但看来我坚持让javascript来模拟基于类的语言..我偷了这个想法 https://stackoverflow.com/questions/20149166/prototype-closure-in-the-constructor/20151610#20151610并以我的方式实现,代码位于本文的后面。

    幕后的想法是通过更高的原型来提供更高的可访问性,并通过闭包访问最高的原型。

    假设我们有三个原型A, D and G, 看起来像

    因为一个对象不可能既是一种类型的实例,又是不在原型链中的另一种类型的实例;我选择的方式是链接protected水平放置并从声明类型的原型中复制成员。这使得嵌套类成为可能,因为在派生程度较低的类型上声明的成员可以传播到派生程度较高的类型;这transmit我的代码中的方法就是这样做的。如果A, D and G有自己的受保护成员,它看起来像:

    访问私有实例的闭包是this['']。它需要一个用于识别类的参数。修饰符持有者只是类标识符,名为y in Function.extend and _在测试代​​码中,它不应该暴露在类声明之外。它也被用作快捷方式this[''].

    _['base']实际上不仅是基本构造函数调用者,而且还是私有实例创建者。它创建私有实例并更新this['']对于具有继承的每个构造函数,因此应始终在构造函数中调用它。

    尽管私有实例可以访问公共成员,但不应该使用它来更改它们,因为this['']不保证在访问公共成员时被调用。但私有实例的访问是;recent记住最近访问的私有实例,并在发生更改时更新受保护的成员。

    我的问题是,如何摆脱这种刷新受保护成员的情况?有没有更好的想法来实现更真实的封装?

    p.s.:我实际上不想要一个使用非标准方法/属性的解决方案..如果使用的方法/属性对于旧浏览器来说太时尚的话,最好有polyfills。


  • 函数.扩展

    Function.extend=function(base, factory) {
        factory.call(initializeClass);
        updateStaticMembersOfDerivedInnerClasses(y['public'].constructor);
        transfer(y['protected'], y['public']);
        return y['public'].constructor;
    
        function y($this) {
            return $this[''](y);
        }
    
        function transfer(target, source, descriptor) {
            if(target!==source?
                'undefined'!==typeof target?
                    'undefined'!==typeof source:
                        false:false) {
                var keys='undefined'!==typeof descriptor? descriptor:source;
    
                for(var key in keys) {
                    if(Object.prototype.hasOwnProperty.call(source, key)) {
                        target[key]=source[key];
                    }
                }
            }
        }
    
        function updateStaticMembersOfDerivedInnerClasses(outer) {
            var member, inner;
    
            for(var key in outer) {
                if(Object.prototype.hasOwnProperty.call(outer, key)?
                    (member=outer[key]) instanceof outer?
                        outer!==(inner=member.constructor):
                            false:false) {
                    transfer(inner, outer);
                }
            }
        }
    
        function initializeInstance() {
            var $this=Object.create(y['private']);
            var derivedGet=this[''];
            var recent=$this;
    
            this['']=function(x) {
                var value=y!==x? derivedGet.call(this, x):$this;
    
                if(value!==recent) {
                    transfer(value, recent, x['protected']);
                    recent=value;
                }
    
                transfer(value, this);
                return value;
            };
    
            base.apply(this, arguments);
            $this['']=this[''];
        }
    
        function initializeClass(derived) {
            y['public']=Object.create(base.prototype);
            y['public'].constructor=derived;
    
            if(Object.prototype.hasOwnProperty.call(base, 'transmit')) {
                base.transmit(y);
            }
            else {
                y['protected']=Object.create(y['public']);
            }
    
            y['private']=Object.create(y['protected']);
            y['base']=initializeInstance;
            transfer(derived, base);
    
            derived.transmit=function(x) {
                if(x['public'] instanceof derived) {
                    x['protected']=Object.create(y['protected']);
                    x['protected'].constructor=x['public'].constructor;
                }
            };
    
            derived.prototype=y['public'];
            return y;
        }
    };
    
  • 测试代码

    'use strict';
    
    var BaseClass=Function.extend(Object, function () {
        var _=this(BaseClass);
    
        var NestedClass=Function.extend(BaseClass, function () {
            var _=this(NestedClass);
    
            function NestedClass(x, y, z) {
                _['base'].apply(this, arguments);
                _(this).Y=y;
                _(this).Z=z;
            }
    
            _['public'].SetX=function (x) {
                _(this).InternalSetX(x);
            };
    
            _['public'].GetX=function () {
                return _(this).InternalGetX();
            };
    
            _['public'].GetY=function () {
                return _(this).Y;
            };
    
            _['public'].SetZ=function (z) {
                _(this).Z=z;
            };
    
            _['public'].GetZ=function () {
                return _(this).Z;
            };
    
            _['private'].Y=0;
        });
    
        function BaseClass(x) {
            _['base'].apply(this, arguments);
            _(this).X=x;
        }
    
        _['protected'].InternalSetX=function (x) {
            _(this).X=x;
        };
    
        _['protected'].InternalGetX=function () {
            return _(this).X;
        };
    
        _['private'].X=0;
        _['protected'].Z=0;
    
        BaseClass.Sample=new NestedClass(1, 2, 3);
    });
    
    var DerivedClass=Function.extend(BaseClass, function () {
        var _=this(DerivedClass);
    
        function DerivedClass(x, y, z) {
            _['base'].apply(this, arguments);
        }
    });
    
    var o=DerivedClass.Sample;
    alert(o.GetX());
    alert(o.GetY());
    alert(o.GetZ());
    o.SetX(3);
    o.SetZ(1);
    alert(o.GetX());
    alert(o.GetY());
    alert(o.GetZ());
    

我也有类似的想法,决定尝试写点东西。一个普通的 js 解决方案。虽然还早,但我喜欢它的结果。您可能也会觉得很有趣。

它不完全是 C#,但提供了更严格的生态系统。以及轻量级解决方案中的其他一些高级 js 功能。

https://github.com/iamlothian/rucksack.js https://github.com/iamlothian/rucksack.js

这不是您的代码的解决方案,而是您的概念的解决方案。如果您的目标是让您的想法发挥作用,那么请务必继续,因为我对结果很感兴趣。

如果你像我一样只是想要一个更加结构化的 js 环境,那么这是我写的一个与你的问题概念类似的野心。

Part 2:

这里的想法是使用闭包和访问限制来创建一个模式,限制定义后代码的使用和更改方式。大部分艰苦的工作已经完成。但该模式留给您来定义。

这是一个快速模拟示例,演示如何实现 public|protect|private 继承。我正在尝试决定我是否将其中一些实现为内置功能,或者让用户实现他们自己的对象扩展,就像我在示例中所做的那样。

http://plnkr.co/edit/ao2hTyBV1b3nYIwr7ZS5 http://plnkr.co/edit/ao2hTyBV1b3nYIwr7ZS5

实现在scripts.js 中。查看控制台以了解发生了什么情况。

Rucksack 提供的是一个用于创建独立的代码模块的框架。这些模块被分组到命名空间中并且可以相互依赖。这些依赖项按照定义延迟解析,因此定义顺序并不重要。解析过程提供了一些其他有用的功能,例如接口匹配和密封模块。

目前的特点:

  • Modular
  • 依赖注入
  • 工厂构造函数(实例对象)
  • 服务构造函数(静态对象)
  • 延迟加载
  • 简单的错误记录(模块内的所有错误都会被捕获并可以传递)
  • 命名空间
  • 可密封模块和命名空间(无法从命名空间外部访问的模块)
  • 模块的全局等待事件
  • 可选配置对象的接口
  • 可选的严格接口注入检查
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 javascript 中实现 C# 访问修饰符? 的相关文章

  • Javascript split 不是一个函数

    嘿朋友们 我正在使用 javascript sdk 通过 jQuery facebook 多朋友选择器在用户朋友墙上发布信息 但是我收到此错误friendId split 不是函数 这是我的代码 function recommendToFr
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 如何用另一个响应替换窗口的 URL 哈希?

    我正在尝试使用替换方法更改哈希 URL document location hash 但它不起作用 function var anchor document location hash this returns me a string va
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐

  • 为什么没有找到从我的类库到另一个类库的连接字符串?

    I am having the architecture like this 其中MVC层是表示层 EF 是类库 Repository 是另一个类库 我试图通过创建 EF 上下文对象将数据从存储库插入数据库 将 EF 引用添加到 Repos
  • SPARK read.jdbc 和自定义架构

    使用spark read format 一次可以以非编程方式添加自定义架构 如下所示 val df sqlContext read format jdbc option url jdbc mysql 127 0 0 1 3306 test
  • 在 Sublime Text 2 中突出显示 Github README.md 格式

    我有 README 文件 我希望 Sublime 仅突出显示由某些 标签 标识的某些代码片段 例如 Here is an example of usage This should be highlighted ruby superhero
  • ES6 类的 Mixins,用 babel 转译

    根据各种消息来源 2ality http www 2ality com 2013 07 defending constructors html 讨论 https esdiscuss org topic traits mixins for c
  • grep 仅由大写字母组成的整个单词

    看起来这很简单 但我遇到了麻烦 我有一个文本文档 例如 如下所示 这是一个文本文档一些大写的单词但并非全部都是全部大写iPhone 我想要的是解析该文档并仅匹配仅由大写字母组成的整个单词 如下所示 文本文件 SOME 但不是全部大写 我写了
  • vscode 中 Windows 10 中的 Node.js 安装错误

    Exception calling DownloadString with 1 argument s The request was aborted Could not create SSL TLS secure channel At li
  • 以内存高效的方式将大型 csv 读入稀疏 pandas 数据帧

    熊猫read csv函数似乎没有稀疏选项 我有 csv 数据 里面有很多零 它压缩得很好 并且去掉了任何0值将其减小到几乎原始大小的一半 我尝试先将其加载到密集矩阵中read csv然后打电话to sparse 但它需要很长时间并且在文本字
  • 如何在 div 元素内水平居中图像?

    如何在容器 div 内居中对齐 水平 图像 这是 HTML 和 CSS 我还添加了缩略图其他元素的 CSS 它按降序运行 因此最高的元素是所有内容的容器 最低的元素位于所有内容的内部 thumbnailwrapper color 2A2A2
  • 绕点 xna 2D 旋转

    我正在尝试围绕另一个对象 半圆形纹理 旋转一个对象 框纹理 我不知道从哪里开始 如果有人能帮助我 我将不胜感激 http msdn microsoft com en us library ff433988 aspx http msdn mi
  • QT4:如何重新启动应用程序?重新设置? [复制]

    这个问题在这里已经有答案了 1 我想重新启动我的 QT4 应用程序 只是同一应用程序的正常关闭和启动 2 为什么 好吧 我需要一个选项来 重置 一切 重新启动应用程序似乎是最简单的方法 问题是 有很多课程和一切 我没有时间将它们的每个设置恢
  • 如何比较两个图像?

    public void winCheck if button1 Image img1 w1 P2 button1 Image new Bitmap win cross png button2 Image new Bitmap win cro
  • 在刀片模板中包含 css 文件吗?

    我想在我的 Laravel Blade 模板中包含一个 css 文件 我试过了 include public path css styles css 但它说视图不存在 它确实存在 如何包含 css 文件 请注意 我知道这不是链接 css 文
  • JavaScript 回调函数中的变量范围

    我预计下面的代码会警告 0 和 1 但它警告 2 两次 我不明白原因 不知道是不是jquery的问题 另外 如果这篇文章的标题和标签不准确 请帮助我编辑
  • 如何用不同的标记绘制多条线

    我想绘制多条线MATLAB http en wikipedia org wiki MATLAB这样做 每一行的标记都会不同 我知道通过颜色可以实现这一点ColorSet hsv 12 有没有像这种简单的标记方法 好吧 我不知道内置功能MAT
  • 检测文本中的信用卡号

    我正在尝试找到一种组件或方法来检测文本中不同类型的信用卡号码 我找到了很多有关验证信用卡号的信息 但我需要能够获取文本正文 例如网页并检查是否存在信用卡号 银行帐号和 或排序代码 有谁知道有一个可以帮助商业或其他方面的组件吗 具体来说 我的
  • 黑莓表视图

    这是我的应用程序 如何在下面添加表格视图或网格 我应该画所有东西吗请帮忙 这是我的代码 import net rim device api ui import net rim device api ui component import n
  • Bash 中的 if、elif、else 语句问题

    我似乎无法弄清楚以下问题是什么if声明是关于elif and then 请记住printf仍在开发中 我只是还无法在声明中对其进行测试 因此很可能是错误的 我收到的错误是 timezone string sh line 14 syntax
  • 如何在 SwiftUI 中的文本末尾添加按钮?

    我想在游戏中心设置中创建一个类似于 Apple 的 UI 其中文本末尾有一个可点击的链接 我正在使用 SwiftUI 我尝试结合Text and Button有几个方面 Form Text A social gaming service t
  • PHP - 如何在没有 API 访问令牌的情况下从 Instagram 获取图像

    我可以在没有 Instagram API 或访问令牌的情况下从 Instagram 个人资料获取图像吗 您可以获得所有图像 只需迭代它们page info 另外 还有更方便的获取json的方式 otherPage nasa profileU
  • 如何在 javascript 中实现 C# 访问修饰符?

    Summary 我尝试在 javascript 中正确实现继承和封装 就像在基于类的语言 例如 c 中一样 丑陋的部分是受保护的成员在私有实例中有多个副本 这些副本只能通过闭包访问 除了将这些成员刷新到私有实例之外我没有任何想法 如果可以的