var a = function(b) { this.b = b; //属性 }; a.prototype.f = function() { return this.b; //方法 };
var aa = new a("Hello World!");
aa.b // "Hello World!"
aa.f() // "Hello World!"
1.
构造函数的属性是属于实例的而且两个互不干扰,在不同的堆栈中
构造函数上定义的方法,不是持有同一引用,实例的方法存放在内存不同的地方
2.
在prototype上定义的属性,在所有的实例中都共享同一份,在任何地方对其设置,所有的实例都同时产生变化
在prototype上定义的方法,持有同一引用,实例的方法存放在同一块内存区域
3.总结
在构造函数中定义的属性,每个实例都有一个副本,互不影响;但是在prototype上定义的属性,在所有的实例中共享同一个属性,对属性的改变会影响到所有的实例。(当改变构造函数的prototype的话,其他实例也会根着改变!)
那么属性最好定义在构造函数中,而方法最好定义在prototye中,否则每个实例的方法都占据一块内存。