创建对象的几种模式

/**
*下面是一些创建对象的模式,可反复看
*以创建人为例子,人有自己的名字和年龄,并有一个说自己名字和年龄的方法
**/

//模式一:为了避免重复代码如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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值