一:Class and private And public

JS 中的类以 function 进行声明,同时 JS 也支持声明私有 private 和公有 public 成员,只不过跟 C# 不一样,它们不是使用这两个关键字实现的。具体如何实现,直接看代码:

function SampleClass(arg1) {

/* 声明了一个私有方法 */
    function priMethod1() {
        alert("private method 1");
    }

/* 声明了一个私有变量,并赋值 */
    var x1 = 3;

/* 声明了一个私有变量,并赋值 */
    var x2 = arg1;

/* 声明了一个私有变量,并立刻执行 priMethod1,将返回值赋值给该变量 */
    var y = priMethod1();

/* 声明了一个私有变量,并定义了一个方法,并将该方法的引用赋值给该变量
       备注:所以,不会执行,到 z(); 时候才会执行;
     */
    var z = function() {
        alert("private method 2");
    };

/* 声明了一个共有变量,并定义了一个方法,并将该方法的引用赋值给该变量
     */
    this.PubMethod1 = function () {
        alert("public method 1");
    };

/* 以下为 公共成员 ,注解同上*/
    this.A = 2;
    this.B = this.PubMethod1();

this.C = function() {
        alert("public method 2");
    };
}

上面的代码中我们可以理解 SampleClass 同时也声明了一个带一个参数的构造器,构造器参数本身左右 SampleClass 的一个私有变量存在;

二:new SampleClass(2) 发生了什么事情?

如果用 OO 的思想来理解,

var testClass = new SampleClass(2);

首先成了一个对象,并执行构造方法。在上面的代码中,注释中,已经注明了哪些是声明,哪些是在声明的同时执行了方法。

也就是说,如果 new SampleClass(2),从 UI 的角度来说,我们会看到弹出两条消息:

"private method 1" 和 "public method 1"。

在 testClass 上,我们也体会到 私有成员 和 公有成员 的区别,如果我们在 Visual Studio 中编码,通过 testClass 只能智能感知到公有成员。

三:JS 中属性?

JS 中没有属性这一说,以

this.B = this.PubMethod1();

举例,我们调用在:

testClass.B;

的时候,实际上根本不会去执行 PubMethod1 这个方法,PubMethod1 这个方法实际上是在构造器中已经被执行过了。所以,我们要通过 testClass 去执行代码,只能通过为 SampleClass 定义方法的方式来完成。

四:this 关键字以及如何在类内部获取到当前对象

在 SampleClass 中,我们通过 this 关键字来创造公有成员,即意味着,通过 this 在类型内部获取到了当前对象。那么,是否在 SampleClass 内部使用 this 获取到的永远是当前对象内?显然不是的。假设在 SampleClass 内部,有如下一段代码:

this.SomeData = [];

this.TestMethod1 = function() {

$.ajax({
        type: "GET",
        url: "http://localhost:7340/Paper/GetQuestionUnit",
        success: function(data) {
            this.SomeData = data;            
        }
    });
};

实际上,在 success 回调方法内部,对于 this.SomeData 的赋值是不会成功的。如果我们通过调试器,查看此处的 this,它代表是回调方法的引用所代表的那个对象本身,如下:

那么,我们就是要在方法内部得到当前对象怎么办,方法是在 SampleClass 内部声明一个私有成员,然后:

var parentThis = this;

然后,在你需要用到当前对象的时候,使用 parentThis 就可以了。

最新文章

  1. Oracle 11.2.0.4 RAC安装最新PSU补丁
  2. SAP RFC
  3. tomcat黑/白名单设置
  4. 一次Promise 实践:异步任务的分组调度
  5. 重新编译安装gcc-4.1.2(gcc版本降级)之TFS安装
  6. JavaScript实现dropdownlist选定值后将选定值的key与value填入两个textbox中
  7. 针对无线信道衰落特性分析3G,4G,5G的关键技术异同点
  8. 【Fiddler】手机抓包
  9. AngularJs中文社区学习资料
  10. 让Sqlite脱离VC++ Runtime独立执行
  11. OpenTK教程-2绘制一个三角形(正确的方法)
  12. WebStorm开发工具设置React Native智能提示
  13. Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)
  14. JavaScript知识点 思维导图
  15. .NET CORE学习笔记系列(3)——ASP.NET CORE多环境标识
  16. 【转载】Python and Mysql Andy Dustman
  17. 【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志
  18. C++复习:类和对象
  19. C#中 EF(EntityFramework) 性能优化
  20. bzoj1625 / P2871 [USACO07DEC]手链Charm Bracelet

热门文章

  1. C#实现盛大盛付通充值卡状态查询
  2. IntelliJ IDEA 2017.2安装
  3. 《Android源码设计模式》--策略模式
  4. 使用 Python 可以做什么?
  5. CSUOJ 1895 Apache is late again
  6. 一文搞定 Mybatis 的应用
  7. Java 集合之 Collection
  8. dSploitzANTI渗透教程之启动zANTI工具
  9. web服务端安全之权限漏洞
  10. linux文件删除,剩余空间没变化