创建对象及原型模式

来源:互联网 发布:指南针炒股软件诈骗 编辑:程序博客网 时间:2024/05/21 23:54
工厂模式
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 构造函数)。
1 0
原创粉丝点击