-
第六章
-
理解对象
- 属性类型
-
数据属性
Configurable:能否通过 delete 删除属性从而重新定义属性,能否修改属性的特 性,或者能否把属性修改为访问器属性
Enumerable:表示能否通过 for-in 循环返回属性
Writable::表示能否修改属性的值
Value:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候, 把新值保存在这个位置
默认值都是true
修改属性默认的特性:Object.defineProperty()方法
'Object.defineProperty(
person, “name”, {
writable: false,
value: “Nicholas”
}); ’
-
访问器属性
Configurable:和数据属性一样
Enumerable:一样
Get:在读取属性时调用的函数。默认值为 undefined
Set:在写入属性时调用的函数。默认值为 undefine
-
定义多个属性
-
Object.definePro- perties()方法:
接收两个对象参数:第一 个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对 应
'Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
value: 1
}, ’
-
读取属性的特性
-
Object.getOwnPropertyDescriptor()方法
接收两个参数:属性所在的对象和要读取其描述符的属性名称。返回值是一个对象
-'Object.defineProperties(book,
{ _year: { value: 2004 }
edition: { value: 1 }}’
-
-
-
- 属性类型
-
-
创建对象
-
工厂模式
- 函数来封装以特定接口创建对象
-
构造函数模式
用函数强行改变某些属性的值
-
调用方法
-
当作构造函数使用
- 'var person = new Person(“Nicholas”, 29, “Software Engineer”); ’
-
作为普通函数调用
- 'Person(“Greg”, 27, “Doctor”); // 添加到 window ’
-
在另一个对象的作用域中调用
- 'var o = new Object(); Person.call(o, “Kristen”, 25, “Nurse”); ’
-
-
缺点
- 每个方法都要在每个 实例上重新创建一遍
-
-
原型模式
-
每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法
-
原型对象
- 就是在创建对象时,里面的prototype会指向一个对象,实例化后,都会指向这个对象,它就是原型对象
-
原型与 in 操作符
- in 操作符会在通 过对象能够访问给定属性时返回 true,无论该属性存在于实例中还是原型中
-
语法
- 为减少 不必要的输入,也为了从视觉上更好地封装原型的功能,更常见的做法是用一个包含所有属性和方法的 对象字面量来重写整个原型对象
-
原型的动态性
- 实例中的指针仅指向原型,而不指向构造函数
-
原生对象的原型
- 通过原生对象的原型,不仅可以取得所有默认方法的引用,而且也可以定义新方法
-
原型对象的问题
-
它省略了为构造函数传递初始化参数这一环节,结果所有实例在 默认情况下都将取得相同的属性值
-
对引用类型值的属性,都会指向同一个地方
-
-
组合使用构造函数模式和原型模式
- 构造函数模式用于定义实 例属性,而原型模式用于定义方法和共享的属性
-
动态原型模式
- 可以通过 检查某个应该存在的方法是否有效,来决定是否需要初始化原型
-
寄生构造函数模式
- 创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象;但 从表面上看,这个函数又很像是典型的构造函数
-
稳妥构造函数模式
- 一是新创建对象的 实例方法不引用 this;二是不使用 new 操作符调用构造函数
-
-
-
继承
-
原型链
利用原 型让一个引用类型继承另一个引用类型的属性和方法
-
默认的原型
-
所有引用类型默认都继承了 Object,而 这个继承也是通过原型链实现的
-
原型和实例的关系
-
使用 instanceof 操作符,只要用 这个操作符来测试实例与原型链中出现过的构造函数,结果就会返回 true
-
使用 isPrototypeOf()方法。同样,只要是原型链中出现过的原型,都可以说是该 原型链所派生的实例的原型,因此 isPrototypeOf()方法也会返回 true
-
-
谨慎地定义方法
-
给原型添加方法的代码一定要放在替换原型的语句之后
-
通过原型链实现继承时,不能使用对象字面量创建原型方法
-
-
原型链的问题
-
过包含引用类型值的原型属性会被所有实例共享
-
在创建子类型的实例时,不能向超类型的构造函数中传递参数
-
-
-
借用构造函数
在子类型构造函数的内部调用超类型构造函数
-
传递参数
-
借用构造函数的问题 :方法都在构造函数中定 义,无法函数复用
-
-
组合继承
是使用原型链实现对原型属性和方 法的继承,而通过借用构造函数来实现对实例属性的继承
-
原型式继承
是借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型
- 借用一个中转函数来完成继承。
-
寄生式继承
创建一个仅用于封装继承过程的函数,该 函数在内部以某种方式来增强对象,后再像真地是它做了所有工作一样返回对象
-
寄生组合式继承
借用构造函数来继承属性,通过原型链的混成形式来继承方法
-
-
小结
这一章就是讲了关于创建对象和继承相关东西,创建对象是基础,有工厂模式和构造函数和原型等构造方法,他们各自有各自的优缺点,继承的话我感觉其他两个还好于原型式继承,用一个函数来专门做中转,感觉有点怪怪的,可能是我还没有理解。它好像是用一个函数传进去一个对象把这个对象作为一个新对象的原型对象,然后返回新的对象。好像是这样的把。
JavaScript第六章
最新推荐文章于 2022-09-24 22:37:41 发布