创建对象的几种模式

来源:互联网 发布:数据库备份与灾难恢复 编辑:程序博客网 时间:2024/05/22 02:29
/***下面是一些创建对象的模式,可反复看*以创建人为例子,人有自己的名字和年龄,并有一个说自己名字和年龄的方法**///模式一:为了避免重复代码如var obj = {....}的代码出现,萌生了最初的工厂模式,缺点:无法获知对象的类型function createPerson(name,age){    // 创建一个对象    var o = new Object();    o.name = name;    o.age = age;    o.say = function(){        console.log('My name is ' + this.name + "; my age is " +  this.age + '.');    }    //工厂模式返回封装好的对象    return o;}var sqf = createPerson('shaoqianfei',22);sqf.say();console.log(sqf instanceof Object);// 这是缺陷所在,无法获知类型console.log(sqf instanceof createPerson);//模式二:构造函数模式,用的比较多的,this和new Person()是关键,注意,还没有return.// 构造函数,相当于java中的类function Person(name,age){    // 关键要弄清楚new之后此函数内发生了什么    this.name = name;    this.age = age;    this.say = function(){        console.log('My name is ' + this.name + "; my age is " +  this.age + '.');    };}var person1 = new Person('liuxiang',23);var person2 = new Person('liuxiang2',24);person1.say();console.log(person1 instanceof Object);// 这是相比工厂模式的其中一个优点,可以获知类型console.log(person1 instanceof Person);// 缺点,每次new一个对象,就要在Person()里面重新执行一遍say(),因为person1和person2的say()不相同,而函数也是对象,不信看下面console.log(person1.say == person2.say); //false //所以,这种方式(构造函数方式)在完成同样任务时,却要产生多个say()实例,没有必要这样,没必要在之前就将函数绑定到特定对象//可以采取将函数对象创建到构造函数外面,用变量引用的方法(指针)来达到只需要创建一次方法就ok的目的。见高程第三版p147第5行的函数。//但是呢。由于构造函数的这个缺点,我们又不能完全把函数定义到全局,因为,如果对象的方法很多,那么全局方法也就很多。而且,没有封装好//所以,我们用原型模式可以实现。//模式三: 原型模式console.log("模式三:原型模式,我们先看看之前的原型是怎样的");console.log(Person.prototype.isPrototypeOf(person1));  //Person.proto对象是person1的原型吗?回答: 是的console.log(Object.getPrototypeOf(person1) == Person.prototype);  //(ie9+方法)person1的原型对象是不是与Person.prototype指向的对象相等? 是的
0 0
原创粉丝点击