面向对象
面向对象是现实的抽象方式,用对象来描述事务,更有利于我们将现实的事物抽离成代码的数据结构
创建对象的方式
new Object()
var obj=new Object();obj.name='rv';obj.age=20;
字面量形式
var obj={name:'rv',age:20};
工厂模式
缺陷:
- 无法准确判断对象类型
function createPerson(name,age){var p={};p.name=name;p.age=age;p.running=function(){console.log(this.name+"在跑步")}return p;}
构造函数
/* 构造函数调用方式,不加小括号则为不传参调用 */var foo1=new Person;var foo2=new Person('rv',20);function Person(name,age){this.name=name;this.age=age;}Person.prototype.runing=function(){console.log(this.name+"在跑步");}
对象属性描述符
Object.defineProperty()
Object.defineProperty(obj,prop,descriptor)/*obj:对象prop:需定义或修改的属性名或Symboldescriptor:属性描述符*/
属性描述符
- 数据属性描述符
- 存取属性描述符
1. 数据属性描述符
[[Configurable]]
表示属性是否可以通过delete删除属性,是否可以修改它的特性
- 当我们直接在对象上定义属性时,默认[[Configurable]]为true
- 当我们通过属性描述符定义一个属性时,默认[[Configurable]]为false
[[Enumerable]]
表示属性是否可以通过for-in或者Object.keys()返回该属性
- 当我们直接在对象上定义属性时,默认[[Enumerable]]为true
- 当我们通过属性描述符定义一个属性时,默认[[Enumerable]]为false
[[Writable]]
表示是否可以修改属性值
- 当我们直接在对象上定义属性时,默认[[Writable]]为true
- 当我们通过属性描述符定义一个属性时,默认[[Writable]]为false
[[value]]
表示属性的value值
- 默认情况下这个值为undefined
var obj={name:'rv'}Object.defineProperty(obj,'age',{value:20,configurable:false,enumerable:false,writable:true})
2. 存取属性描述符
使用场景
- 隐藏某一个私有属性,不希望直接被外界使用和赋值
- 截获某个属性的获取和设置的过程
[[Configurable]]
表示属性是否可以通过delete删除属性,是否可以修改它的特性
- 当我们直接在对象上定义属性时,默认[[Configurable]]为true
- 当我们通过属性描述符定义一个属性时,默认[[Configurable]]为false
[[Enumerable]]
表示属性是否可以通过for-in或者Object.keys()返回该属性
- 当我们直接在对象上定义属性时,默认[[Enumerable]]为true
- 当我们通过属性描述符定义一个属性时,默认[[Enumerable]]为false
[[get]]
获取属性时会触发的函数
- 默认为undefined
[[set]]
获取属性时会触发的函数
- 默认为undefined
var obj={name:'rv'}Object.defineProperty(obj,'age',{configurable:false,enumerable:false,get:function(){return this._age;},set:function(value){this._age=value;}})
Object.defineProperties()
var obj={}Object.defineProperties(obj,{name:{configurable:false,value:'rv'},age:{enumerable:true,get:function(){return this._age;},set:function(value){this._age=value;}}})
Object.getOwnPropertyDescriptor(),Object.getOwnPropertyDescriptors()
/* 获取单个属性描述符 */var obj={name:'rv'}Object.getOwnPropertyDescriptor(obj,'name');/* 获取所有属性描述符 */Object.getOwnPropertyDescriptors(obj);
Object.preventExtensions()
/* 禁止对象添加新的属性 */Object.preventExtensions(obj);
Object.seal()
/* 禁止对象新增/删除属性,不能修改属性配置,也影响__proto__的属性值不可修改 */Object.seal(obj);
Object.freeze()
/* 冻结对象中的现有属性值是不可变的 */Object.freeze(obj);
new操作符调用过程
- 在内存中创建一个新对象
- 这个对象内部的
[[prototype]]属性会被赋值为该构造函数的prototype属性 - 构造函数内部的this指向创建出来的新对性
- 执行函数的内部代码
- 如果构造函数没有返回非空对象,则返回创建出来的新对象
