面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是通过原型链的方法。
一、构造函数、原型与实例之间的关系
每创建一个函数,该函数就会自动带有一个 prototype 属性。该属性是个指针,指向了一个对象,我们称之为 原型对象。指针就好比学生的学号,原型对象则是那个学生。我们通过学号找到唯一的那个学生。假设突然,指针设置 null, 学号重置空了,不要慌,对象还存在,学生也没消失。只是不好找了。
原型对象上默认有一个属性 constructor,该属性也是一个指针,指向其相关联的构造函数。
通过调用构造函数产生的实例,都有一个内部属性,指向了原型对象。所以实例能够访问原型对象上的所有属性和方法。
所以三者的关系是,每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
function Dog (name) { this.name = name; this.type = ‘Dog‘; } Dog.prototype.speak = function () { alert(‘汪!‘); } var doggie = new Dog(‘jiwawa‘); doggie.speak(); //汪!
以上代码定义了一个构造函数 Dog(), Dog.prototype 指向的原型对象上的自带属性construtor指向了 Dog,即 Dog.prototype.constructor = Dog. 然后在这个原型对象上定义了一个方法speak。实例doggie由于其内部指针指向了原型对象,所以可以访问到 speak方法。
Dog.prototype 只是一个指针,指向的是原型对象,但是这个原型对象并不特别,它也只是一个普通对象。假设说,我们这时候,让 Dog.protptype 不再指向最初的原型对象,而是另一个类 (Animal)的实例,情况会怎样呢?
(正文明天写。)
时间: 2024-09-30 05:35:26