构造函数、原型对象、对象实例三者之间的关系

原创 3332581689 随笔 js基础 380阅读 2017-06-09 17:31:33 举报

在面向对象编程中,有三个概念非常重要,那就是构造函数、原型对象、对象实例,他们之间有着非常紧密的联系,就像是一个家庭里的母亲、父亲和儿子。
接下来就让我们来理清他们之间的各种纠葛:

1 首先 构造函数-其实就是一个函数,不过她是有着某种构造的函数。

function officer(_name,_age,_stature){
this.name = _name;
this.age = _age;
this.stature = _stature;
}

以上这个函数就是一个构造函数,她给自己定义了一种规范。

2 当创建一个函数的时候,系统会默认给这个函数匹配了一个原型,这个原型是一个对象,可以称为原型对象,同时也生成了一个属性prototype,这个属性指向原型。就是说想要找到原型需要通过这个属性。例如以上这个构造函数,找她的原型用officer.prototype。

而这个原型对象和创建的这个函数一一对应,同时,原型对象也生成了一个属性constructor,而这个属性又是指向构造函数的。于是构造函数和原型都拥有指向对方的属性,可以通过这个属性相互联系。

3 对象实例就相当于儿子,根据构造函数而来,实例化出来的对象也有一个自己的属性proto,这个属性也是一个指针,指向原型对象。于是这三个之间就有了相互联系的桥梁,可以携手完成任务。

比如下面的赵云、关羽他们的属性结构就是由officer这个函数而来,但他们又各自有各自不同的属性。

var zy = new officer("赵云",22,186);
var gy = new officer("关羽",32,180);

通过这样的方式来创建对象不是和工厂模式一样了嘛!不同点就在这个原型上,那么大家都知道工厂模式创建对象最大的问题就是方法占有内存重叠的问题,前面我们创建的是属性,那么如果创建方法怎么做呢?

在这里我们使用原型来创建方法,上面讲了构造函数和原型之间的关系,正好我们可以利用起来。

officer.prototype.say = function(){
alert("我叫"+this.name);
}

在以上函数中,officer.prototype就表示原型对象,将say()方法放在原型对象里面,实例可以像调用构造函数里面的方法一样使用,经过测试我们发现,指针都指向一个空间,所以不会出现占有内存重叠的情况。

alert(zy.say == gy.say);//ture

属性通过构造函数来创建,方法通过原型来创建,这样既可以批量生产出拥有各自不同属性又拥有相同方法的对象,且相同方法的内存地址只有唯一一个,节省了内存空间。

我用了一个简单的图来表现出三者之间的关系。

构造函数与原型

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复