创建对象及原型模式

工厂模式
function createPerson(name,age){
     var o=new Object();
     o.name=name;
     o.age=age;
     o.say=function(){
         alert(this.name) 
     };
     return o;
}
createPerson('小明','18');

构造函数模式
funciton Person=('name','age'){
     this.name=name;
     this.age=age;
     this.say=say;
}
function say(){
     alert(this.name)
}
var person1=Person('小明','18');
构造函数的调用方式,需要创建 Person 对象的新实例,必须使用 new 操作符。
在这里,每个新实例都只会调用同一个 say( ) 方法,避免导致不同实例上的同名函数都是不相等。
在代码读取每个对象的属性的时候,会执行两次搜索,第一次是在实例中找,找到即返回,第二次是在原型对象中找,找到即返回。

原型模式
function Preson(){
}
Person.prototype.name='xiaoming';
Person.prototype.age=18;
Person.prototype.say=function(){
     alert(this.name)
}
var person1=new Person();
我们每创建一个函数都会有一个 prototype 属性,这个属性是一个指针,指向这个函数的原型对象。
原型对象里会有一个 constructor 属性,这个属性也是一个指针,指向的构造函数。
使用 new 字符串之后,会把这个构造函数和属性方法及原型对象的属性方法给到实例化出来的新对象。
实例出来的新对象,有个 [[prototype]] 属性(__proto__),这个属性也是一个指针,指向原型对象。

组合使用构造函数模式和原型模式
function Person(name,gae){
     this.name=name;
     this.age=age;
     this.friends=['joey','ross']
}
Person.prototype={
     constructor:Person,
     say:function(){
          alert(this.name);
     }
}
var person1=new Person('xiaoming','18');
构造函数用于定义实例属性,原型模式用于定义方法和共享的属性,每个实例对象都会有自己的一份实例属性,同时共享着对方法的引用,最大限度节省了内存。
这个例子中,为了避免重复添加 prototype,这里将 Person.prototype 设置为一个以对象字面量的形式创建的对象,但同时要更改这个对象 constructor 属性,将它的指针指向 Person 构造函数,因为在这里本质上是重写默认的 prototype 对象,因此 constructor 属性也成了新的对象的属性(指向 Objcet 构造函数)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值