js面向对象之创建对象1

方法一:工厂模式

所谓工厂模式,简单点儿说就是按照工厂生产的过程创建对象,原材料->加工->返还产品

 1 function createPerson(name,age,job)
 2 {
 3     //送入原材料
 4     var o = new Object();
 5     //加工
 6     o.name = name;
 7     o.age = age;
 8     o.job = job;
 9     o.sayName = function(){
10         alert(this.name);
11     }
12     //出厂
13     return o ;
14 }
15 
16 var person1 = createPerson("Nicole",12,"software engnieer");
17 var person2 = createPerson("Join",15,"writer");

优点很明显,解决了创建多个具有相似属性和方法的对象的问题,但是却没有解决对象识别的问题
比方说:

alert(person1 instance of Object);//true
alert(person1 instance of createPerson);//false

方法二:构造函数模式

function Person(name,age,job)
{
    this.name = name;
    this.age = age;
    this.job = job;

    this.sayName = function(){
        alert(this.name);
    }
}

var person1 = new Person("Nicole",12,"software engnieer");
var person2 = new Person("Join",15,"writer");

从上面可以看出,构造函数模式,不在函数内部创建Object对象,而是用this代替,最后创建实例时使用new
其中:

var person1 = new Person("Nicole",12,"software engnieer");

经历了以下几个过程:
1.var o = new Object();
2.o = this(Person);
3.执行构造函数中的代码;
4.返回新对象

优点:1.使用new创建对象,更符合面向对象的创建习惯;
         2.红宝书上说创建构造函数意味着将它的实例标识为一种特定的类型,我的理解是,就是创建了一种类型,你可以用它去创建实例。

   alert(person1 instanceof Object);//true
   alert(person1 instanceof Person);//true

 为什么可以这样呢,因为你用Person实例化的对象,它都保存了一个constructor属性,指向Person。

      alert(person1.constructor == Person);//true
      alert(person2.constructor == Person);//true

缺点:首先,我们看一段代码:

      this.sayName = function(){}
      this.sayName = new Function("");

这两段代码在逻辑上是等价的,也就是说在ECMAscript中,函数是对象,每定义一个函数,就会实例化一个对象,因此,不同实例的不同函数是不相等的,用构造函数模式创建的对象,虽然看起来是大家“共用”了一个功能函数,但其实它们都是不同的对象,这就很没有必要。

转载于:https://www.cnblogs.com/aiying/p/5430253.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值