在prototype继承中 原型类中不能有成员对象! 所有成员必须是值类型数据(string也可以)
用prototype继承有执行效率高,不会浪费内存,为父类动态添置方法后子类中马上可见等的优点。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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, ,
其实很简单, 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.