一、原型对象的概念与作用
原型对象的概念
在JavaScript中,每个函数都有一个prototype属性,这个属性指向函数的原型对象。原型对象是一个对象,它包含了可以由特定类型的所有实例共享的属性和方法。
原型对象的作用
- 原型对象的主要作用是实现对象的继承。
- 通过将方法和属性添加到原型对象上,所有实例对象都可以共享这些方法和属性,从而节省内存空间。
二、原型链的概念与举例
原型链的概念
原型链是指对象通过其原型属性相互连接形成的一条链。每个对象都有一个原型对象,原型对象本身也有一个原型对象,这样一直向上追溯,直到找到一个原型对象为null的对象为止,这条链就称为原型链。
原型链举例
js
class Person {
name = "孙悟空"
age = 18
sayHello() {
console.log("Hello,我是", this.name)
}
}
const p = new Person()
onsole.log(p.__proto__.__proto__.__proto__)三、函数的原型链是什么样子的?
在JavaScript中,函数也是对象,因此函数也有原型链。函数的原型链如下:
- 函数对象本身
- 函数对象的原型对象(Function.prototype)
- Function.prototype的原型对象(Object.prototype)
- Object.prototype的原型对象(null)
js
function Foo() {}
console.log(Foo.__proto__ === Function.prototype); // true
console.log(Function.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__ === null); // true四、Object的原型链是什么样子的?
Object是JavaScript中所有对象的基类,其原型链如下:
- Object对象本身
- Object.prototype
- Object.prototype的原型对象33(null)
js
const obj = {};
console.log(obj.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__ === null); // true五、继承原理与原型对象关系
JavaScript中的继承是通过原型链实现的。当访问一个对象的属性或方法时,JavaScript引擎会首先查找该对象本身是否有该属性或方法。如果没有,则会沿着原型链向上查找,直到找到该属性或方法或到达原型链的顶端(null)。
六、原型对象修改举例
通过修改原型对象,可以为所有实例对象添加新的方法或属性。例如:
js
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + ' makes a noise.');
};
const dog = new Animal('Dog');
dog.speak(); // 输出:Dog makes a noise.
Animal.prototype.speak = function() {
console.log(this.name + ' barks.');
};
dog.speak(); // 输出:Dog barks.txt
大部分情况下,我们是不需要修改原型对象
注意:
千万不要通过类的实例去修改原型
1. 通过一个对象影响所有同类对象,这么做不合适
2. 修改原型先得创建实例,麻烦
3. 危险
处理通过__proto__能访问对象的原型外,
还可以通过类的prototype属性,来访问实例的原型
修改原型时,最好通过通过类去修改
好处:
1. 一修改就是修改所有实例的原型
2. 无需创建实例即可完成对类的修改
原则:
1. 原型尽量不要手动改
2. 要改也不要通过实例对象去改
3. 通过 类.prototype 属性去修改
4. 最好不要直接给prototype去赋值