ECMAscript二(对象使用)

ECMAscript二(对象使用)

1、对象和变量的的作用域

  a.和其他面向对象的语言相比,严格的说来ecmascript并没有静态作用域,对象方法中的子方法为方法的公共作用域的方法,而非静态方法。

  b.this关键字总是指向调用方法的对象,在调用本对象的属性时最好使用this关键字,否则编译器将会把属性当做局部或全局变量查找起引用。

  c.变量作用域的提升

        var name = "jay";

        function show() {
            alert(name);
            var name = "boy";
            alert(name);
        }

        show();
View Code

  ECMAScript规范中描述了所有javascript代码都运行在一个执行上下文中.执行上下文在javascript中不是可访问的实体,但了解他们对于全面理解函数和闭包的工作原理是非常重要的.规范中说:

     当控制权转移到ECMAScript的可执行代码时,控制权进入了一个执行上下文.活动的执行上下文逻辑上形成一个栈。栈顶的执行上下文是当前正在运行的执行上下文.

     每一个执行上下文都有一个变量对象。在函数内部定义的所有变量和函数都被添加为这个对象的属性。下面的算法描述了这一过程.

     对于任何形参,在变量对象上添加相应的属性,并把他们的值设为传递给函数的值.

     对于任何函数声明,在变量对象上添加相应的属性,值既为该函数. 如果一个函数声明使用了和形参中任何一个相同的标识符,那么这个属性(指形参)将被覆盖.

     对于任何变量声明,在变量对象上添加相应的属性,初始化他们的值为undefined,不管这些变量在源代码中是怎么样被初始化的.如果一个变量使用与一个已经定义过的属性相同的标示符,那么这些定义过的属性不会覆盖.

  该算法的作用就是所谓的函数和变量声明的提升.请注意,虽然函数作为整体被提升,但变量却只有他们的声明被提升。请注意变量的初始化发生在源代码中变量被定义的地方

 

2、如何构建对象的私有公共的方法、属性。

  通常我们通过IIFE模块模式将代码组织成模块,编写类库,抽象出公用代码。

  如何定义命名空间抽象相应的模块代码呢,我们参考jquery源码:

  

 (function( window, undefined ) {  
   var jQuery = function( selector, context ) {   // The jQuery object is actually just the init constructor 'enhanced'  
      return new jQuery.fn.init( selector, context, rootjQuery );  
   },  
 
   // Expose jQuery to the global object  
   window.jQuery = window.$ = jQuery;  
})( window ); 

   //模块模式的主要作用是区分出私有变量/函数和公共变量/函数

        (function ($, undefined) {

            //定义mycommon对象
            var MyCommon = {};
            //私有属性
            var _color, _name, _createTime;
            //公共属性
            MyCommon.color = function () { return this.color; }
            //私有方法
            var _showcolor = function () { alert('color'); }
            $.MyCommon = MyCommon;
        })($);

    通过以上方式,我们可以很好的实现封装和基于模块的扩展。

参考文章:http://developer.51cto.com/art/201304/389494.htm、 http://hi.baidu.com/cqgphper/item/3fb0ed1f965b4381feded5a9、《javascript 高级编程》。

原文地址:https://www.cnblogs.com/LiJianBlog/p/ecmascript.html