为什么要用prototype

在prototype继承中 原型类中不能有成员对象! 所有成员必须是值类型数据(string也可以)
用prototype继承有执行效率高,不会浪费内存,为父类动态添置方法后子类中马上可见等的优点。

function ClassA() {      this.name = 'A'; }

ClassA.prototype = {     str : "BB",     arr : ['K'] }

实例化:     var a = new ClassA(); var b = new ClassA();
alert(a.str+ "," + b.str+ "," + a.arr + "," + b.arr); 打印 BB,BB,K,K
a.name = 'C'; a.arr.pop() alert(a.str+ "," + b.str+ "," + a.arr + "," + b.arr); 打印 C,BB, ,
View Code


其实很简单, Function 的 prototype 属性允许所有的function实例共享一组 函数和成员, 我们在使用prototype提供的属性的时候,得到的是属性的引用。

这也就是为什么a.str改变了,b.str没改变,而a.arr 将内容改写了, b.arr也随之改变的原因。

a.str只是对prototype里面str的一个引用,a.str = "C", 只是将a的str引用指向了C,并没有改变prototype对象中的str的值。

而a.arr.pop 切实的修改了arr的内容,由于b也是共享同一个arr内存,因此也变了。

另外prototype 允许动态的向已经定义好的函数和对象添加属性和方法。现在很多面向对象技术是基于prototype实现的继承。

遵循简单的原则: 类实例共享的方法写如prototype, 这样节省内存。 成员变量不要放到prototype中,常量也不要放入prototype.

posted @ 2013-12-23 17:40  小水阿哥  阅读(337)  评论(0编辑  收藏  举报