《JavaScript语言精髓与编程实践》读书拾遗-非函数式语言特性

  • 变量的生存周期是指它何时被创建和被释放。在JavaScript中,一个变量的创建是在:引擎做语法分析时,发现显式声明;引擎做代码执行,发现试图写(例如赋值)一个未被创建的变量时。而变量的释放则是在:引擎执行到函数结束/退出操作时,将清除函数内的未被引用的变量;引擎执行到全局的代码块终结或引擎卸载和重载入时,将清除全局的亦是和数据的引用。
  • 变量作用域讨论的是“在形式上这个变量能在哪个范围内存取到”。
  • 对于具名函数的声明来说,抛开语法解析导致的问题不讲,一个具名函数是完全等同于一个匿名函数赋值给一个已经声明的变量标识符。
  • 在JavaScript中,“空对象(null)“是作为一个保留字存在的。null不是“空的对象”,而是代表这样的一个对象:属性对象类型;对象是空值的。因为它是对象类型,所以用(typeof null)会返回object,甚至可以用for…in…去列举它,只不过因为它是空值,所以没有任何方法和属性,因而列举不到内容。
  • 所谓“空的对象”,是一个标准的、通过Object()构造的对象实例,即通过obj = new Object();或者obj = { };空的对象具有“对象”的一切特性,可以存取预定义属性和方法(toString、valueOf等)。
  • 对象只有“构造自某个原型”的说法,而不存在“持有(或拥有)某个原型”的说法。原型其实也是一个对象实例。原型的含义是指:如果构造器有一个原型对象A,则由该构造器创建的实例都必然复制自A。
  • JavaScript在构造对象的时候,采用的是读遍历的机制,即把写复制的粒度从原型变成了成员。这种方法的特点是:仅当写某个实例的成员时,将成员的信息复制到实例的的映像中,而并不是在刚构造时就从原型中复制全部成员。
  • 在读遍历的机制下,所有的对象实例需要维护一张成员列表,这个成员列表指向在对象实例中发生了修改的成员名、值与类型。这张表是否与原型一致并不重要,只需要遵循两条规则:保证在读取时首先被访问到;如果在对象中没有指定属性,则尝试遍历对象的整个原型链,直到原型为空(null)或找到该属性。存取实例中的属性,比存取原型中的属性效率要高,因为少了一个指针访问。
  • 实例创建后constructor属性总先被赋值为当前函数,当用delete删除constructor属性时,constructor则会指向父类的函数。
  • 由构造过程可以了解到,JavaScript中的对象实例本质上只是“一个指向其原型的,并持有一个属性列表的结构”。对象原型所具有的基本性质有:toString、toLocaleString、valueOf、construtor、propertyIsEnumerable、hasOwnProperty、isPrototypeof。除了上述普通对象的成员之外,还具有几个特别的、属于函数类型对象的成员:call、apply、caller、arguments、length、prototype。
  • 在JavaScript中,基于“JS变量作用域”来实现封装性时,只能实现public和private这两种封装性。
    function MyObject() {
        /* 私有变量和函数 */
        var data = 100;
        function _run(v) {
            alert(v);
        }
    
        /* 公开属性和方法 */
        this.value = "The data is ...";
        this.run = function() { _run(this.value + data); }
    }
  • JavaScript是弱类型的,通过typeof运算考察变量时,它要么是对象(object),要么是非对象(number, undefined, string等),绝不存在“像是某个对象或者某个类”这样的多态问题。
This entry was posted in JavaScript. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>