【红宝书笔记】 创建对象的几种方法

来源:互联网 发布:生命起源知乎 编辑:程序博客网 时间:2024/05/01 04:40

之前看for-in的时候不解为什么这是用来遍历对象属性的,但是有些属性却遍历不出来,但是单独用in判断是否可访问一个属性名的时候发现返回的是true。。。

对象的属性有四种特性,[[Configurable]]是否能够通过delete删除,[[Enumerable]]是否能通过for-in访问,[[Get]]在读出属性时调用的函数,[[Set]]在写入属性时调用的函数。程序员添加的属性默认都是可删除,可用for-in的。所以这样就解释了为什么有些属性用for-in访问不出来。

言归正传。。。

创建对象主要有三个基本的模式,剩下的几个模式都是基于这三个基本的模式。

1.工厂模式

function gene(name, age){var obj = new Object();obj.name = name;obj.age = age;obj.say = function(){console.log(this.name, this.age);}return obj;}var x = gene();

每调用一次gene,就产生一个新的对象。跟批量生产一样。这样产生的问题就是不能确定对象的类型

2.构造函数模式

function gene(name, age){this.name = name;this.age = age;this.say = function(){console.log(this.name, this.age);}}var x = new gene();

使用new方法,把gene函数当做构造函数来使用。new的过程有四步:

1.创建一个新对象

2.把this指针指向这个对象

3.执行构造函数中的代码

4.返回新对象

构造函数很方便,但是由于有些执行相同功能的函数创建了多次,浪费了空间。

3.原型模式

利用函数的prototype属性,可以把执行相同功能的函数放在prototype中共享一份代码。节约资源。但是这样会导致一些引用类型的对象在不同对象操作的时候修改了值。

以下是混合模式:

1.构造函数模式和原型模式

把不能共享的,如引用类型的值放在构造函数中,可以共享的放在原型中

2.动态原型

通过一些参数的传入判断是否需要把一些值放在原型中共享

3.寄生构造

function gene(name, age){var obj = new Object();obj.name = name;obj.age = age;obj.say = function(){console.log(name, age);}return obj;}
寄生模式第一眼看上去就像工厂模式,但是使用的时候是用new操作符创建的对象。这样可以创建具有一些额外方法的对象。


0 0