论坛首页 Web前端技术论坛

Class.create方法建立的类有Bug,类的对象实例共享‘对象引用型属性’!

浏览 3651 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-17  
在用Prototype的Class.create方法建立类时,如果类中含有‘对象引用型的属性’,比如数组,则用这样的类new出n个实例,这些实例共享这些属性。例如

<script type="text/javascript">
var TestClass = Class.create();

Object.extend(TestClass.prototype, {

    ary : [],    

    initialize : function (obj) {
        ary.push(obj);
    }
});

var tc1 = new TestClass("abc");

var tc2 = new TestClass("def");

alert(tc2.ary.length);

</script>


上面的代码结果显示tc2对象实例的ary数组属性的长度是2。
   发表时间:2007-04-17  
smcdl 写道
在用Prototype的Class.create方法建立类时,如果类中含有‘对象引用型的属性’,比如数组,则用这样的类new出n个实例,这些实例共享这些属性。例如

<script type="text/javascript">
var TestClass = Class.create();

Object.extend(TestClass.prototype, {

    ary : [],    

    initialize : function (obj) {
        ary.push(obj);
    }
});

var tc1 = new TestClass("abc");

var tc2 = new TestClass("def");

alert(tc2.ary.length);

</script>


上面的代码结果显示tc2对象实例的ary数组属性的长度是2。


这不是什么bug , 你对extend方法没有理解, 你的代码的意思是 ary 是TestClass类共有的属性,而不是每个类的实例属性,

把 ary的声明放到 initialize 方法里就对了
0 请登录后投票
   发表时间:2007-04-17  
不应该呀,我扩展的是TestClass.prototype,又不是TestClass类本身,每个实例都应该拥有自己的ary
0 请登录后投票
   发表时间:2007-04-17  
楼主对prototype的理解有问题,prototype中的所有属性、方法都会附加到新实例上……
0 请登录后投票
   发表时间:2007-04-17  
的确如此,所以prototype最好不要放可改变状态的对象。

只放一些值属性和一些不可变的对象。

比如function,string,number,boolean,

用的最多的就是function类型。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics