接着前面两篇,终于到了第三篇了,天真热。
1 组合使用构造函数模式和原型模式
前面讲到了js中的原型模式,是为了解决不共享的问题,然而也因为原型模式的共享性带来了一些问题。原型中所有的属性,对它的实例都是共享的,但是有时我们希望每个实例中能有自己私有的属性,那么此时我们就要组合使用构造函数模式和原型模式。例:
function Person (sex) {
this.sex=sex;
}
Person.prototype.name="DJL";
Person.prototype.job="student";
var person1=new Person("男");
var person2=new Person("女");
alert(person1.sex);//男
alert(person1.job);//student
alert(person2.sex);//女
alert(person2.job);//student
这种组合方式,是目前使用最广的一种创建自定义类型的方法。
2 动态原型模式
先来个例子:
//动态原型模式
function Person (name,job,age) {
this.name=name;
this.job=job;
this.age=age;
alert("进来了");
if(typeof this.sayName !="function"){
Person.prototype.sayName=function(){
alert(this.name); }
}
}
var person1=new Person("djl","student",22);
var person2=new Person("DJL","student",22);
person1.sayName(); //djl
person2.sayName(); //DJL
在这里如果sayName不存在,则会在原型中添加。我们可以看到在执行person1.sayName();时进入了if条件语句,而在执行person2.sayName();并没有进入。这就避免了在创建很多实例对象时反复去添加同一个原型属性。这里对原型所做的修改,能够立即在所有对象实例中得到反映。对于这种模式创建的对象,还可以使用instanceof 判断其具体类型。
alert(person1 instanceof Person);//true
3 寄生构造模式 </br>
function Person () {
var o=new Object();
o.name="djl";
o.age=22;
o.job="student";
o.sayName=function(){
alert(this.name);
} return o;
}
首先,返回的这个对象与构造函数或者与构造函数的原型都没有什么关系,所以不能依赖instanceof 来检测其具体类型。和工厂模式有一样的问题。
好了就写这么多了,我能写的也只有这么多了。感觉就是在解决如何实现属性共享和解决属性共享带来的问题,即对象属性有时要做到共享,有时要做到独立,有时两者都要兼备啊!
欢迎大家继续交流,如果有更多见解,不要不告诉我哦!最后还是向大家推荐一下这本书《JavaScript高级程序设计》。
DJL箫氏:一个狂热的前端爱好者,性别男,爱好女,目前实习于创维集团
上一篇 浅谈js的几种模式(二)