《JavaScript核心技术开发解密》读书笔记(一)
《JavaScript核心技术开发解密》读书笔记(二)
《JavaScript核心技术开发解密》读书笔记(三)
《JavaScript核心技术开发解密》读书笔记(四)
《JavaScript核心技术开发解密》读书笔记(五)
下面是第九章–面向对象
对象: 无序属性的集合,其属性可以包含基本值、对象或者函数。对象是由一系列无序的key-value对组成。
创建对象的方式有:使用new关键字来创建、通过字面量的形式创建、通过构造函数的方式创建。
new关键字在创建实例时经历如下过程:
- 先创建一个新的、空的实例对象;
- 将实例对象的原型,指向构造函数的原型;
- 将构造函数内部的this,修改为指向实例;
- 最后返回该实例对象。
原型链
原型对象其实也是普通对象,几乎所有的对象都可以是原型对象,也可以是实例对象,还可以是构造函数。
当我们随便创建一个函数add时,与它相关的原型链如下图:

对原型链上方法与属性的访问,与作用域的访问类似,也是一个单向查找的过程。虽然add方法与Object并没有直接的关系,但是它们用处于一条原型链上,因此add可以根据原型链的特点访问Object上的方法。
实例方法、原型方法、静态方法
- 构造函数中的this指向的是新创建的实例,因此在往this上添加方法与属性时,其实是在往新创建的实例上添加属性与方法,所以构造函数中的方法可称之为实例方法
- 通过prototype添加的方法,将会挂载到原型对象上,因此称之为原型方法
- 挂载在构造函数上的方法称之为静态方法
function Foo() {
this.bar = function () {
return 'bar in Foo'; // 实例方法
}
}
Foo.bar = function () {
return 'bar in static'; // 静态方法
}
Foo.prototype.bar = function () {
return 'bar in prototype'; // 原型方法
}
继承
继承分为有构造函数的继承与原型的继承两种。
父类对象:
var Person = function (name, age) {
this.name = name;
this.age = age;
}
Person.prototype.getName = function () {
return this.name;
}
Person.prototype.getAge = function () {
return this.age;
}
构造函数继承,通过call/apply来实现
var Student = function(name, age, grade) {
// 通过call方法还原Person构造函数中的所有处理逻辑
Student.call(Person, name, age);
this.grade = grade;
}
原型继承,先封装一个方法,该方法会根据父类对象的原型创建一个实例,该实例即为子类对象的原型。
function create(proto, options) {
// 创建一个空对象
var tmp = {};
// 让这个新的空对象成为父类对象的实例
tmp.__proto__ = proto;
传入的方法都挂载到新的对象上,新对象将作为子类对象的原型
Object.defineProperties(tmp, options);
return tmp;
}
使用该方法类实现原型的继承
Student.prototype = create(Person.prototype, {
constructor: {
value: Student
},
getGrade: {
value: function () {
return this.grade;
}
}
})

3万+

被折叠的 条评论
为什么被折叠?



