JavaScript原型

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);//true
alert(person2.constructor == Person);//true

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


__proto__

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值