前面说过,java的属性是每个对象都会拷贝一份,但是方法确实共享的,这样就大大的节约了空间
js怎样实现这样的方式呢,
我们将属性在构造函数中定义,将方法在原型中定义:
function Person(name,age,friends){
this.name = name;
this.age = age;
this.friends = friends;
}
Person.prototype.say = function(){
alert(this.name +":"+this.age+"-->friend:"+this.friends.join(","));
}
var p1 = new Person("张三",23, ["王五","赵六"]);
p1.say();
结果:张三:23-->friend:王五,赵六
如果此时再对单个对象进行push操作就不会改变原型中的值了,也就不会影响其他的对象
function Person(name,age,friends){
this.name = name;
this.age = age;
this.friends = friends;
}
Person.prototype.say = function(){
alert(this.name +":"+this.age+"-->friend:"+this.friends.join(","));
}
var p1 = new Person("张三",23, ["王五","赵六"]);
var p2 = new Person("张三",23, ["王五","赵六"]);
p1.say();
p1.friends.push("沈器");
p1.say();
p2.say();
结果:
张三:23-->friend:王五,赵六
张三:23-->friend:王五,赵六,沈器
张三:23-->friend:王五,赵六
还要注意原型重写与原型定义的先后顺序
function Person(name,age,friends){
this.name = name;
this.age = age;
this.friends = friends;
}
Person.prototype = { //千万要注意 = 是重写原型,注意不要覆盖以前指定的
want:function(){
alert("live:"+ this.friends[1]);
} //方法
}
Person.prototype.say = function(){
alert(this.name +":"+this.age+"-->friend:"+this.friends.join(","));
}
动态原型:
java中属性和方法都是放在类中的,javascript如果向这方面靠近的话,怎么办呢
function Person(name,age,friends){
this.name = name;
this.age = age;
this.friends = friends;
Person.prototype = { //千万要注意 = 是重写原型,注意不要覆盖以前指定的
want:function(){
alert("live:"+ this.friends[1]);
} //方法
}
}
如果用这种方法的话,在重写以前对原型定义的属性和方法都会消失,因此可能出现问题,当然不推荐这种方法。
function Person(name,age,friends){
this.name = name;
this.age = age;
this.friends = friends;
if(!Person.prototype.say){
Person.prototype.say = function(){
alert("good");
}
}
}
这样在创建对象的时候方法就仅仅会创建一次在原型中。