一: 原型
在JavaScript中,每个对象都有一个原型(prototype),原型是一个对象或null
。对象可以通过原型继承属性和方法。
原型继承是JavaScript中的一种特性,它允许对象通过继承原型的属性和方法,实现属性和方法的共享和复用。当我们访问一个对象的属性或方法时,如果对象本身没有定义该属性或方法,JavaScript会在对象的原型上查找该属性或方法。
每个对象都有一个隐藏的内部属性[[Prototype]]
(可以使用__proto__
访问),它指向对象的原型。当我们访问对象的属性时,JavaScript引擎会先在对象自身上查找,如果找不到,就会沿着原型链向上查找,直到找到该属性或到达原型链的顶端(即Object.prototype
)。原型链是通过每个对象的原型链形成的。
我们可以使用Object.create()
方法来创建一个具有指定原型的新对象,或者使用构造函数和new
关键字创建对象,构造函数可以通过原型的属性和方法进行共享。
// 定义一个构造函数
function Person(name) {
this.name = name;
}
// 在构造函数的原型上定义方法
Person.prototype.sayHello = function() {
console.log('Hello, ' + this.name);
};
// 创建一个Person对象
var person = new Person('John');
person.sayHello(); // 输出:Hello, John
二:原型链
原型链是JavaScript中实现继承的一种机制。每个对象都有一个隐藏的内部属性 [[Prototype]]
(可以使用 __proto__
访问),它指向该对象的原型。当访问一个对象的属性或方法时,如果对象本身没有定义该属性或方法,JavaScript会沿着原型链向上查找,直到找到该属性或方法或到达原型链的顶端(即 Object.prototype
)。
// 创建一个父对象
var parent = {
name: "John",
sayHello: function() {
console.log("Hello, " + this.name);
}
};
// 创建一个子对象,并将父对象设置为其原型
var child = Object.create(parent);
child.name = "Jane";
child.sayHello(); // 输出:Hello, Jane
原型链的工作原理 :如果一个对象没有定义某个属性或方法,JavaScript引擎会在它的原型上继续查找,直到找到该属性或方法或到达原型链的顶端。这种方式实现了对象之间的属性和方法的共享和继承,使得代码更加灵活和可扩展。Object
的原型对象也有__proto__
属性指向null
,null
是原型链的顶端.
三 : 原型的继承方法
下面给出JavaScripy
常见的继承方式:
- 原型链继承
- 构造函数继承(借助 call)
- 组合继承
- 原型式继承
- 寄生式继承
- 寄生组合式继承
原型链继承
原型链继承是比较常见的继承方式之一,其中涉及的构造函数、原型和实例,三者之间存在着一定的关系,即每一个构造函数都有一个原型对象,原型对象又包含一个指向构造函数的指针,而实例则包含一个原型对象的指针
构造函数继承
借助 call
调用Parent
函数
组合继承
前面我们讲到两种继承方式,各有优缺点。组合继承则将前两种方式继承起来
原型式继承
这里主要借助Object.create
方法实现普通对象的继承
寄生式继承
寄生式继承在上面继承基础上进行优化,利用这个浅拷贝的能力再进行增强,添加一些方法
寄生组合式继承
寄生组合式继承,借助解决普通对象的继承问题的Object.create
方法,在前面几种继承方式的优缺点基础上进行改造,这也是所有继承方式里面相对最优的继承方式