创建对象
1 | // 使用Object创建对象 |
属性类型
ECMAScript中有两种属性:数据属性,访问属性。
数据属性:是一个包含数据值的位置,有4个描述其行为的特性:
名称 | 值 |
---|---|
configurable | 表示能否通过delete删除属性而重新定义,默认true |
enumerable | 表示能否通过for-in循环返回属性,默认true |
writable | 表示能否修改属性的值,默认true |
value | 包含这个属性的属性值,默认undefined |
1 | /*修改属性的默认特性,使用Object.defineProperty(obj,propertyName,descriptor)方法 |
访问器属性:访问器属性不包含属性值,它们包含getter,setter函数(非必须)
该访问属性也有4个特性:
名称 | 值 |
---|---|
configurable | 表示能否通过delete删除属性而重新定义,默认true |
enumerable | 表示能否通过for-in循环返回属性,默认true |
get | 读取属性调用的函数,默认undefined |
set | 设置属性调用的函数,默认undefined |
1 | var book = { |
创建对象的几种方式
工厂模式
1 | function createGirlFried(name,job){ |
#####构造函数1
2
3
4
5
6
7
8
9
10
11
12
13
14function Person(name,job){
this.name = name;
this.job = job;
this.sayName = function(){
alert(this.name);
}
}
var p1 = new Person('zs','doctor');
var p2 = new Person('zs','doctor');
alert(p1.construtor == p2.construtor) // true
p1 instanceof Person // true
p1 instanceof Object // true
使用 new 操作符,调用构造函数创建对象,会经历以下4步
- 创建一个新对象
- 将构造函数的作用域赋给新对象(this 指向这个新对象)
- 执行构造函数中的代码(为这个对象添加新属性)
- 返回新对象
1 | //构造函数 当函数用 |
原型模式
每个函数都有一个prototype属性,这是属性是一个指针,指向一个对象(即原型对象,包含共享的属性和方法)
1 | function Person(name,job){ |
虽然可以通过对象访问保存在原型中的值,却不能通过对象实例重写原型中的值,如果添加同名属性将屏蔽原型中的同名属性
如果依旧要访问原型的的同名属性,只能delete obj.propertyName
(设置null undefined 无效)
1 | Person.prototype.construtor == Person // true |
组合使用构造函数和原型模式
1 | function person(name) { |
动态原型模式
1 | function person(name) { |
寄生构造函数
1 | function Person(name, age) { |
稳妥构造函数
1 | // 适合在一些安全的环境中, 没有公共属性, 其方法也不应用this |
原型继承
1 | function SuperType(name) { |
组合继承
1 | // 常用的继承模式( 原型继承 父类方法无法继承过来) |
原型继承
1 | // ECMAScript实现 |