在之前学习javascript模块发开发的过程中,看到了一篇好文,是极客学院的学习javascript设计模式,本文的所有demo地址见本人的github:https://github.com/sunshine940326/js-object-demo
javascript的设计模式,首先,我们需要知道什么是函数(基础知识,大神跳过)
#定义函数
构造器模式
js不支持类的概念,但它支持与对象一起使用的特殊Constructor(构造器)函数。通过在构造器前面加new关键字,告诉js想树勇构造器一样实例化一个新的对象,并且对象成员由该函数定义。在构造器内,关键字this引用新创建的对象。
在面向对象编程中,构造器是一个当新建对象的内存被分配后,用来初始化该对象的一个特殊函数。
对象构造器是被用来创建特殊类型的对象的,首先它要准备使用的对象,其次在对象初次被创建时,通过接收参数,构造器用来对成员的属性和方法进行赋值。
创建对象
在js中创建对象有三种基本方式:
下面的每一种方式都会创建一个新对象
- 对象直接量
|
|
- Object.create1var newObject = Object.create(null)
Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象。
语法
Object.create(proto, [ propertiesObject ])
参数
- proto
一个对象,作为新创建对象的原型。或者为 null。 - propertiesObject
可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。注意:该参数对象不能是 undefined,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。1234567891011121314151617181920212223242526272829303132var myCar = {name:"Fort",drive:function () {console.log("I'm driving!")},panic:function () {console.log("wait")}}// Use Object.create to instantiate a new carvar youCar = Object.create(myCar);// Now we can see that one is a prototype of the otherconsole.log(youCar.name)var vehicle = {getModel:function () {console.log("The model of this vehicle is.." +this.model)}}var car = Object.create(vehicle,{"id":{value:'car1',},"model":{value:'Ford',}})
- 构造函数方式(new)
通过new创建对象,new后跟一个函数调用(构造函数)1var newObject = new Object();
其实这三种方式都可以相互转化
通过字面量方式创建的空对象相当于Object.create(Object.prototype)
下面这两句是等价的,当然,如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码
给对象设置属性和获取属性值
使用.的方式
|
|
使用[]方式
|
|
这两种设置属性的区别
- 使用保留字作为属性名的时候,必须用方括号
- . 不能修改,因为属性名是标识符
- []为字符串,可以修改和创建
Object.defineProperty方式
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。
Object.defineProperty(obj, prop, descriptor)
obj
需要定义属性的对象。
prop
需定义或修改的属性的名字。
descriptor
将被定义或修改的属性的描述符。
创建属性
如果对象中不存在指定的属性,Object.defineProperty()就创建这个属性。当描述符中省略某些字段时,这些字段将使用他们的默认值。拥有布尔值的字段的默认值都是false。value,get和set字段的默认值都是undefined。定义属性时如果没有get/set/value/writable,那它被归类为数据描述符。
通过. []设置的属性,可以使用delete删除,通过Object.defineProperty()设置的属性不能被delete删除,使用 Object.defineProperty() 增加的属性值是不可改变的。
修改属性
如果属性已经存在,Object.defineProperty()将尝试根据描述符中的值以及对象当前的配置来修改这个属性。如果描述符的 configurable 特性为false(即该特性为non-configurable),那么除了 writable 外,其他特性都不能被修改,并且数据和存取描述符也不能相互切换。
Writable 属性
当属性特性(property attribute) writable 设置为false时,表示 non-writable,属性不能被修改。
|
|
Enumerable 特性
属性特性 enumerable 定义了对象的属性是否可以在 for…in 循环和 Object.keys() 中被枚举。
|
|
Configurable 特性
configurable 特性表示对象的属性是否可以被删除,以及除 writable 特性外的其他特性是否可以被修改
添加多个属性和默认值
考虑特性被赋予的默认特性值非常重要,通常,使用点运算符和Object.defineProperty()为对象的属性赋值时,数据描述符中的属性默认值是不同的
Object.defineProperties方式
|
|
