javascript高级程序设计笔记
面向对象
对象的定义
对象是无序属性的集合,其属性可以包含基本值,对象,或者函数。对象的每个属性或方法都有一个名字,而每个名字都印射一个值。
创建对象的方式
通过new关键字创建一个Object实例
var person = new Object();
person.name = 'Nicholas';
person.age = 29;
person.job = 'WEB';
person.sayName = function(){
console.log(this.name);
// Nicholas
}
字面量创建一个对象
var person = {
name : 'Nicholas';
age : 29;
job : 'WEB';
sayName : function(){
console.log(this.name);
}
}
数据属性
数据属性包含一个数值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性。
-
[[Configurable]]: 表示能否通过delete删除属性而重新定义属性,能否修改属性的特性,或者能否把属性
修改为访问器属性。通过字面量定义的属性,他们的这个特性默认值为true。 -
[[Enumerable]]: 表示能够通过for-in循环返回属性。通过字面量定义的属性,他们这个特性默认值为true。
-
[[Writable]] : 表示能否修改属性的值。通过字面量定义的属性,他们这个特性默认值为true。
-
[[Value]]: 包含这个属性的值。读取属性的时候,从这个位置读,写入属性值的时候把新值保存在这个位置。
这个特性的默认值为undefined。
要修改属性默认的特性,必须使用ECMAScript5的Object.definePerty()方法。这个方法接收三个参数:属性
的所在对象,属性的名字和一个描述符对象。其中描述符对象的属性必须是:configurable,enumerable,writable
,value。设置其中的一个或者多个值,可以修改对象的特性值。
var person = {
name : 'hello'
}
Object.defineProperty(person,'name',{
configurable :false,
writable :false,
})
person.name = 'world';
console.log(person.name);
// hello
这里创建了一个person的对象,其名为name的属性为'hello',下面通过Object.defineProperty()方法设置
person.name的值为可读的,所以62行的赋值语句会被忽略;在严格模式下,赋值操作会导致抛出错误。
设计模式
工厂模式
工厂模式抽象了创建具体对象的过程,利用函数来封装以特定接口创建对象的细节
function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
console.log(this.name);
}
return o;
}
var person1 = createPerson('zhangsan',22,'web');
var person2 = createPerson('lisi',22,'java');
函数createPerson()能够根据接收的参数来构建一个包含所有必要信息的Person对象。可以无数次调用这个函数
,而每次它都会返回一个包含三个属性一个方法的对象。
构造函数模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
console.log(this.name);
}
}
var person1 = new Person('zhangsan',22,'web');
var person2 = new Person('lisi'23,'net');
这里的构造函数模式与工厂模式的区别
- 没有显式地创建对象;
- 直接将属性和方法赋值给this对象
- 没有return语句
*** 按照惯例,构造函数始终都应该以一个大写字母开头 ***
要创建Person新的实例,必须使用new操作符,以这种方式调用构造函数会经历一下4个步骤
- 创建一个新的对象
- 将构造函数的作用域赋给新对象(此时this指向了新对象)
- 执行构造函数中的代码
- 返回新的对象
person1,person2分别保存着Person的不同实例。着两个对象都有一个constructor(构造函数)属性
,该属性指向Person。
检测对象类型用instanceof,在上面的例子中所有对象都是Object的实例,同时也是Person的实例
console.log(person1 instanceof Object); //true
console.log(person1 instanceof Person); //true

浙公网安备 33010602011771号