码迷,mamicode.com
首页 > Web开发 > 详细

js面向对象之创建对象1

时间:2016-04-25 11:46:13      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

方法一:工厂模式

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

 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中,函数是对象,每定义一个函数,就会实例化一个对象,因此,不同实例的不同函数是不相等的,用构造函数模式创建的对象,虽然看起来是大家“共用”了一个功能函数,但其实它们都是不同的对象,这就很没有必要。

js面向对象之创建对象1

标签:

原文地址:http://www.cnblogs.com/aiying/p/5430253.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!