JavaScript中的原型链

JavaScript 对象的创建方式

在 JavaScript 中,创建对象的方式包括两种:
1、对象字面量
2、使用new表达式
对象字面量是一种灵活方便的书写方式,例如:

1
2
3
4
5
6
var point = {
p:'test',
alertP:function () {
alert(this.p);
}
}

这样就用对象字面量创建了一个对象 p,它具有一个成员变量以及一个  成员方法 alertP。这种写法不需要定义构造函数,因此不在本文讨论范围之内。这种写法的缺点是,每创建一个  新的对象都需要写出完整的定义语句,不便于创建大量相同类型的  对象,不利于继承等高级特性。

new 表达式是配合构造函数使用的,例如new String('a string'),调用内置的String函数构造一个字符串对象。下面我们用构造函数的方式来重新创建一个实现同样功能的对象,首先是定义构造函数,然后是用调用new表达式:

1
2
3
4
5
6
7
8
function point () {
this.p = 'test';
this.alertP = function () {
alert(this.p);
}
}

var point2 = new point();

那么,在使用new操作符来调用一个构造函数的时候,发生了什么了呢?其实很简单,就发生了四件事:

1
2
3
4
var obj = {};
obj.__proto__ = point.prototype;
point.call(obj);
return obj;

第一行,创建一个空的对象obj
第二行,将这个对象的__proto__成员指向了构造函数对象的prototype成员对象,这是最关键的异步,具体细节将在下文描述。
第三行,将构造函数的作用域赋给新对象,因此point函数中的this指向新对象obj,然后调用point。于是我们就给0bj对象赋值了一个成员变量p,这个成员变量的值就是'test'