js原型和原型链
时间: 2023-07-28 09:21:05 浏览: 97
JavaScript中的每个对象都有一个原型对象(prototype),它充当了对象的父类。原型对象包含了一些共有的属性和方法,子类可以通过继承原型对象来获得这些属性和方法。而原型链(prototype chain)则是一种机制,用于实现基于原型的继承。
在JavaScript中,每个对象都有一个 __proto__ 属性,它指向该对象的原型对象。如果在该对象上找不到某个属性或方法,JavaScript引擎会自动到该对象的原型对象中查找,如果还是找不到,就继续往上查找,直到找到该属性或方法或到达顶层的 Object.prototype 对象为止,这就是原型链的基本思想。
例如,我们创建一个对象:
```
var obj = {
name: "Tom",
age: 18
}
```
这个对象的原型对象就是 Object.prototype,因为 obj 是通过字面量方式创建的,而 Object.prototype 是 JavaScript中所有对象的原型对象。
我们可以通过如下方式来访问 obj 的原型对象:
```
console.log(obj.__proto__); // 输出 Object.prototype
```
当我们调用 obj 的某个属性或方法时,如果在 obj 中找不到,JavaScript引擎就会去 obj.__proto__ 中查找,如果还是找不到,就继续往上查找,这就是原型链的基本原理。
相关问题
js原型和原型链图解
JavaScript中的原型和原型链是理解JavaScript面向对象编程的重要概念之一。
在JavaScript中,每个对象都有一个原型(prototype),原型是一个对象,它包含了共享的属性和方法。当我们访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript会去它的原型中查找。
原型链是由一系列对象组成的链表结构,每个对象都有一个指向其原型的引用。当我们访问一个对象的属性或方法时,如果该对象本身没有,JavaScript会沿着原型链向上查找,直到找到对应的属性或方法或者到达原型链的末尾(null)。
下面是一个简单的图解:
```
+--+
| Object |
+--+
| __proto__ |
| |
| constructor |
| toString() |
| ... |
+--+
^
|
+--+
| Prototype |
+--+
| __proto__ |
| |
| constructor |
| hasOwnProperty()|
| ... |
+--+
^
|
+--+
| Prototype |
+--+
| __proto__ |
| |
| constructor |
| ... |
+--+
^
|
.
.
.
```
在这个图中,每个对象都有一个`__proto__`属性,指向它的原型对象。原型对象也是一个对象,同样有一个`__proto__`属性,指向它的原型对象,以此类推,形成了原型链。
当我们访问一个对象的属性或方法时,JavaScript会先在该对象本身查找,如果找不到,就会沿着原型链向上查找,直到找到对应的属性或方法或者到达原型链的末尾(null)。
js原型和原型链概念
JavaScript中的原型(prototype)和原型链(prototype chain)是面向对象编程的核心特性之一。每个JavaScript对象都有一个内部链接到另一个对象的指针,这个指针就是原型,通常简称为`__proto__`或者`[[Prototype]]`。
1. **原型**:它是一种机制,使得一个对象可以访问其他对象的属性和方法。当你试图访问一个对象的属性时,如果该对象自身不存在这个属性,JavaScript会查找其原型对象,直到找到为止。这被称为“属性查找”。
2. **原型链**:当搜索一个对象的属性未果时,会沿着原型链向上遍历,直到找到该属性或到达原型链顶端(即`null`)。这种递归查找的方式保证了所有继承自共同祖先的对象都可以共享相同的属性和方法。
例如,函数的构造函数有一个内置的`prototype`对象,通过`new`关键字创建的新实例将从该`prototype`继承。如果你在实例上添加新属性,它只会存在于实例本身,但如果该属性已经在原型上存在,则所有实例都会共享这个属性。
阅读全文