zoukankan      html  css  js  c++  java
  • 不要将 Array、Object 等类型指定给 prototype

    在 JavaScript 中,注意不要将 Array、Object 等类型指定给 prototype,除非您的应用需要那么做。先观察如下代码:

    function Foo()
    {
    }
    Foo.prototype.n = 123;
    Foo.prototype.date = { year:2009, month:6, day:25 };

    var f1 = new Foo();
    var f2 = new Foo();
    f1.n = 456;
    f1.date.day = 24;
    alert(f2.n); // 结果为 123
    alert(f2.date.day);

    f2.date.day 结果是多少?25?错,应该是 24。

    这是由于 Array、Object 等与数字、字符串等基本的类型在内存中存储方式不同:

    var items = new Array();

    items 存储的并不是数组的内容,数组的内容存的另一个地方,而 items 变量只是存储这个数组的内存地址。

    所以 Foo.prototype.date = { year:2009, month:6, day:25 }; 这句实际上已经指定了该 Object 的内存,证据

    f1、f2 的 date 的内存位置不同,但其内存中指向的都是同一个 Object(date) 的内存,所以造成了上述的答案。

    要让每个实例的 date 不同,可以这么解决:

    function Foo()
    {
    }
    Foo.prototype.date = null;
    Foo.prototype.ini = function ()
    {
        this.date = { year:2009, month:6, day:25 };


    var f1 = new Foo();
    f1.ini();
    var f2 = new Foo();
    f2.ini();
    f1.date.day = 24;
    alert(f2.date.day); // 结果为 25

    或者直接放在“构造函数”中:

    function Foo()
    {
        this.date = { year:2009, month:6, day:25 };
    }
    Foo.prototype.date = null;

    var f1 = new Foo();
    var f2 = new Foo();
    f1.date.day = 24;
    alert(f2.date.day); // 结果为 25

    当然,这两种解决办法中,实际上都可以将 Foo.prototype.date = null; 去掉,因为在为 this.date 赋值时,如果 this.date 不存在,会创建,相当于只要第一次使用 this.date 就创建了这个属性。

    只不过加上 Foo.prototype.date = null; 可以在一些编辑器中自动感知 Foo 的属性,方便编程罢了。(更新:Visual Web Developer 2008 SP1 已经能够感知 this. 的东西,所以也可以去掉 Foo.prototype.date = null)

    转自:http://www.cftea.com/c/2009/06/M4NFQTP1UY7A3FCE.asp

  • 相关阅读:
    JVM的学习5_____垃圾回收:分代收集算法
    JVM的学习4____GC的作用和垃圾的标记
    JVM的学习3_____逃逸分析与栈上分配
    JVM的学习2____对象实例的内存分配原理
    JVM的学习1_____内存模型
    SpringMVC的学习____6.JSON 和Ajax
    两种方法关联控制器和DOM
    img的src,a的href使用{{}}设置属性不能生效
    ng之{{value}}顺序
    ng之ng-app指令
  • 原文地址:https://www.cnblogs.com/youxin/p/3355490.html
Copyright © 2011-2022 走看看