JavaScript原型

来源:互联网 发布:数据恢复软件评测 编辑:程序博客网 时间:2024/05/29 18:02

JavaScript原型

本文主要对JavaScript原型进行分析,详细阐述了构造函数、原型对象以及对象实例三者之间的关系。


构造函数

何为构造函数?构造函数本身是个函数,只不过该函数是出于创建新对象的目的而定义的。通常我们可以使用new操作符后跟一个构造函数来创建一个对象,如下所示:

示例一:function Person(){}var person1 = new Person();person1.name = "Rowling";console.log(person1.name);//Rowling

上述代码中的Person即为一个构造函数(按照惯例,构造函数名始终都应该以一个大写字母开头,构造函数与普通函数的唯一区别在于调用的方式不同),person1就是采用构造函数Person创建的一个对象实例,通过点表示法为person1的name属性赋值。


prototype

我们所创建的每一个函数(当然包括构造函数)都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象就是该函数的原型对象,也是通过调用该构造函数所创建的那个对象实例的原型对象。
那么何为原型对象呢?我们可以这么理解:只要创建了一个新函数就会有一个与之关联的原型对象,同时会根据一组特定的规则为该函数创建一个prototype属性指向该原型对象。

示例二:function Person(){}Person.prototype.name = "Rowling";Person.prototype.age = 23;Person.prototype.sayName = function(){    console.log(this.name);}var person2 = new Person();console.log(person2.age);//23

上述代码中的Person.prototype就是Person构造函数的原型对象。原型对象中的信息(属性、方法)可以被通过该构造函数创建的对象实例所共享,这一点在之后分析实例和原型对象的时候会再详细说明。


constuctor

每个对象实例都有constructor属性,指向创建其的构造函数。事实上,在创建了构造函数之后,其原型对象默认只会自动取得一个constructor属性,该属性是一个指向该构造函数。即在上述例子中Person.prototype.constructor指向Person。并且该属性也是共享的,所以可以通过对象实例访问,这也就是为何Object的每个实例都有constructor属性的原因。所以根据上述代码会有如下结果:

alert(person1.constructor == Person);//truealert(person2.constructor == Person);//true

因此我们可以得出结论,对象实例的constructor属性其实是来自于其原型(如果不在实例中创建的话)。


__proto__

当调用构造函数创建一个新实例后,该实例的内部会自动包含一个指针指向构造函数的原型对象,该指针即为__proto__。在这里需要强调一下,这个指向关联只存在于对象实例和原型对象之间,而不是存在于实例与构造函数之间。

console.log(person2.__proto__ === Person.prototype);//true

至于构造函数和对象实例,它们之间并没有什么指向关系,对象实例只是通过调用构造函数而生成(new 发方式),而调用构造函数也可创建出很多对象实例。
综上,我们可以用下面一张图来表示构造函数、原型对象以及实例对象之间的关系:
构造函数、原型对象以及对象实例之间的关系图

原创粉丝点击