【红宝书笔记】 创建对象的几种方法
2016-04-13 00:35
246 查看
之前看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操作符创建的对象。这样可以创建具有一些额外方法的对象。
对象的属性有四种特性,[[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操作符创建的对象。这样可以创建具有一些额外方法的对象。
相关文章推荐
- sdsd
- DOM、SAX、JDOM和DOM4J--简单介绍
- win32 汇编 当心 .if eax
- offer题11 数值的整数次方&判断浮点型是否相等&降低求n次方的时间复杂度&3种错误处理方式
- POJ 1330 Nearest Common Ancestors LCA
- 编程规范
- 虚幻4 主线程与渲染线程的同步。
- 站在服务端程序员的角度下的一下编程看法
- LeetCode 231. Power of Two
- mysql 一个无乱码例子
- NSString的copy属性分析 以及 深拷贝浅拷贝
- eclipse中build path 中JDK与java compiler compliance level的问题(转)
- 匿名对象和object的转换
- bzoj2809 apio2012 派遣
- C++作业3
- 生产环境常见的HTTP状态码列表
- codeforce 602A Two Bases
- Android ListView实现上拉到底部的时候自动刷新数据
- C语言循环链表实现
- 协议和代理模式的概念