function HelloWorld(){
this.ages = [],//符合规范
this.showAge = function(){//不符合规范 方法应该定义在原型 节省内存
console.log(this.ages);
}
}
HelloWorld.prototype.names = [];//不符合规范,这样所有对象 使用同一份数组
HelloWorld.prototype.addAge = function(age){
this.ages.push(age);
}
HelloWorld.prototype.addName = function(name){
this.names.push(name);
}
HelloWorld.prototype.showName = function(){
console.log(this.names);
}
HelloWorld.namespaceFunction = function(){
console.log("Test");
}
var h1 = new HelloWorld();
var h2 = new HelloWorld();
h1.addAge(1);
h2.addAge(2);
h1.showAge();
h2.showAge();
h1.addName("h1");
h2.addName("h2");
h1.showName();
h2.showName();
//h1.namespaceFunction(); //这个地方证明 此方法只是一个命名空间
HelloWorld.namespaceFunction();
输出结果
h1的ages :[ 1 ]
h2的ages :[ 2 ]
h1的names:[ 'h1', 'h2' ]
h2的names[ 'h1', 'h2' ]
Test
结论:
规范: 在构造函数内部定义属性,在原型上定义方法。
在构造函数内定义的变量和方法 ,每次实例化 都会分配自己的内存{图中红线}。
在原型定义的变量和方法 ,每次实例化 都会共享内存{图中蓝线}。