读书人

浅谈JavaScript的语言特点

发布时间: 2013-04-02 12:35:26 作者: rapoo

浅谈JavaScript的语言特性

  • // 这是对象字面量
  • var bar = { "prop": "val" };


    还有一点需要知道的是,JSON.parse用来将JSON字符串反序列化成对象,JSON.stringify用来将对象序列化成JSON字符串。老版本的浏览器不支持这个对象,但你可以通过json2.js来实现同样的功能。

    原型

    1. function Animal (){??
    2. ? ? // ...
    3. }
    4. function cat (){??
    5. ? ? // ...
    6. }??
    7. cat.prototype = new Animal();//这种方式会继承构造函数里面的。
    8. cat.prototype = Animal.prototype;//这种方式不会继承构造函数里面的。
    9. //还有一个重要的细节需要注意的就是一定要维护自己的原型链,新手总会忘记这个!
    10. cat.prototype.constructor = cat;


    如果我们彻底改变函数的prototype属性(通过分配一个新的对象),那原始构造函数的引用就是丢失,这是因为我们创建的对象不包括constructor属性:

    1. function A() {}
    2. A.prototype = {
    3. ??x: 10
    4. };
    5. var a = new A();
    6. alert(a.x); // 10
    7. alert(a.constructor === A); // false!


    让我们一起看下MDN上关于constructor的解释吧:prototype:Returns a reference to the Object function that created the instance’s prototype.因此,对函数的原型引用需要手工恢复:

    1. function A() {}
    2. A.prototype = {
    3. ??constructor: A,
    4. ??x: 10
    5. };
    6. var a = new A();
    7. alert(a.x); // 10
    8. alert(a.constructor === A); // true


    然而,提交prototype属性不会影响已经创建对象的原型(只有在构造函数的prototype属性改变的时候才会影响到),就是说新创建的对象才有有新的原型,而已创建对象还是引用到原来的旧原型(这个原型已经不能被再被修改了)。

    1. function A() {}
    2. A.prototype.x = 10;
    3. var a = new A();
    4. alert(a.x); // 10
    5. A.prototype = {
    6. ??constructor: A,
    7. ??x: 20
    8. ??y: 30
    9. };
    10. // 对象a是通过隐式的[[Prototype]]引用从原油的prototype上获取的值
    11. alert(a.x); // 10
    12. alert(a.y) // undefined
    13. var b = new A();
    14. // 但新对象是从新原型上获取的值
    15. alert(b.x); // 20
    16. alert(b.y) // 30


    因此,“动态修改原型将影响所有的对象都会拥有新的原型”是错误的,新原型仅仅在原型修改以后的新创建对象上生效。这里的主要规则是:对象的原型是对象的创建的时候创建的,并且在此之后不能修改为新的对象,如果依然引用到同一个对象,可以通过构造函数的显式prototype引用,对象创建以后,只能对原型的属性进行添加或修改。

    变量对象在函数执行上下文中,VO(variable object)是不能直接访问的,此时由活动对象(activation object)扮演VO的角色。 活动对象是在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。arguments属性的值是Arguments对象:

    1. function foo(x, y, z) {
    2. ??// 声明的函数参数数量arguments (x, y, z)
    3. ??alert(foo.length); // 3
    4. ??// 真正传进来的参数个数(only x, y)
    5. ??alert(arguments.length); // 2
    6. ??// 参数的callee是函数自身
    7. ??alert(arguments.callee === foo); // true
    8. }


    当进入执行上下文(代码执行之前)时,VO里已经包含了下列属性:1. 函数的所有形参(如果我们是在函数执行上下文中);

  • 读书人网 >JavaScript

    热点推荐