创建对象的方式

来源:互联网 发布:pdf文字编辑器for mac 编辑:程序博客网 时间:2024/05/18 02:08

一.  字面量方式

a)     特点:一次只能创建一个

b)     优点:简单,直观.适用于只需要创建一次的情况(设计模式中的单例模式)

c)     缺点:不能批量创建对象,一次只创建一个对象.如果需要同事创建多个同类型的对象则不能使用字面量的方式

d)     例如: var a={}       直接赋值 var b ={ name:’越’}

二.  工厂模式

a)     特点: 批量生产

b)     优点:快速创建多个对象

c)     缺点:不能很好的标记其类型,也就是__proto__.constructo值全部都是object.形式上与其他创建对象的语法不一致

d)     例如:

function ZGY(name,age){var obj={ }obj.name = name ;obj.age = age;return obj}

工厂模式,批量生产:

var z = ZGY(‘赵广’,’20’);var g = ZGY(‘广越’,’21’);var y = ZGY(‘赵越’,’22’);

但是,我们尽量不要这么干,要尽量使用 var a=new ZGY()

那么在这个new的过程中,发生了什么,

一旦使用new就会产生三步:

1.    创建一个空对象: var obj = {}

2.    调用ZGY.call(obj)调用ZGY函数,同时把里面的this换成对象obj,那么相当于所有this.即加在this上的属性就加在了obj上

3.    Obj.__proto__ = ZGY.prototype,让这个对象与ZGY函数建立关系,obj是ZGY创造的

4.    Return obj

上面的过程,不需要写代码,是系统自己完成的

,然后对比发现,工厂模式其实就是把new具体写出来了.

但是有一个问题出现了,如果有一个作为构造器的函数,但是他有return这个返回值,那么这个函数还能不能当构造器使用.

答案是,可以,但是当原来的return 1/’abc’ 返回的是这些基本数据类型,那么系统会忽略掉这一句,new 的时候会重新一个return,但是当return返回的本来即丨一个引用数据类型(3引用)的时候,使用new就不会创建心的return了

 

三.  构造器的方式创建对象

a)     如果我们要把一个函数当作构造器,那么在定于这个函数时,最好首字母大写

b)     优点:创建出来的对象有自己的’标记符’ 也就是__proto__.constructo有值且不完全相对和工厂模式那样全为bject不一样.    优点二,好看…………

c)     所有的对象都有自己独立的方法的拷贝,浪费了空间,也不复合面向对象的特点

怎么解决这个缺点,我们是通过把属性写在构造器内部,而方法写在构造器原型上这种办法来解决的

d)     

function ZGY(name,age){  this.name = name;  this.age = age;  this.say = function(){    return this.name  }}
var z = new ZGY(‘广越’,’23’)

四.  原型方式创建对象

a)     怎么解决构造器的方式创建对象的缺点,我们是通过把属性写在构造器内部,而方法写在构造器原型上,而这种办法就是原型方式创建对象

b)     

function ZGY(name,age){this.name = name;this.age = age;}ZGY.prototype.say = function(){        return   this.name;}var z = new ZGY(‘广越’,’23’)


c)     把自有属性写在构造器上,可以通过形参去赋值,这样每个对象的自有属性都不一样,把属性写在原型上,可以使我们创建的对象都可以访问这些方法是

结论:创建一个对象,用字面量的方法,创建多个对象,用原型方式去创建

原创粉丝点击