原型和原型链面试题
时间: 2023-07-30 09:06:38 浏览: 108
好的,你想问的是有关 JavaScript 中原型和原型链的面试题,对吧?
首先,让我们回顾一下原型和原型链的概念:
- 原型(prototype):每个 JavaScript 对象都有一个原型对象,它是该对象的父对象,也可以理解为该对象的模板。通过原型,对象可以继承父对象的属性和方法。
- 原型链(prototype chain):由于每个对象都有一个原型对象,因此可以形成一条原型链。如果在当前对象中找不到所需的属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到为止。
下面是一些可能的原型和原型链面试题:
1. JavaScript 中的对象是如何继承属性和方法的?
JavaScript 中的对象通过原型继承属性和方法。每个对象都有一个原型对象,它是该对象的父对象,也可以理解为该对象的模板。通过原型,对象可以继承父对象的属性和方法。如果在当前对象中找不到所需的属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到为止。
2. 什么是原型链?
由于每个对象都有一个原型对象,因此可以形成一条原型链。原型链是一种继承机制,它通过沿着对象的原型链查找属性和方法,实现了对象之间的继承关系。如果在当前对象中找不到所需的属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到为止。
3. 如何创建一个对象的原型?
在 JavaScript 中,可以使用 Object.create() 方法创建一个对象的原型。该方法接受一个参数,即新对象的原型对象。例如:
```
var parent = {
foo: function() {
console.log("hello");
}
};
var child = Object.create(parent);
```
在此示例中,我们创建了一个名为 parent 的对象,它有一个名为 foo 的方法。然后,我们使用 Object.create() 方法创建了一个名为 child 的对象,它的原型对象是 parent。这意味着 child 可以继承 parent 中的所有属性和方法,包括 foo 方法。
4. 对象的 __proto__ 属性和 prototype 属性有什么区别?
每个 JavaScript 对象都有一个 __proto__ 属性,它指向该对象的原型对象。例如:
```
var parent = { foo: function() {} };
var child = Object.create(parent);
console.log(child.__proto__ === parent); // true
```
prototype 属性只存在于函数对象中,它是该函数的原型对象。例如:
```
function Person() {}
Person.prototype.foo = function() {};
var p = new Person();
console.log(p.prototype); // undefined
console.log(Person.prototype); // { foo: [Function] }
```
因此,__proto__ 属性和 prototype 属性的作用不同,前者用于继承,后者用于函数对象的原型继承。
5. 如何判断一个对象是否是另一个对象的原型?
在 JavaScript 中,可以使用 isPrototypeOf() 方法判断一个对象是否是另一个对象的原型。例如:
```
var parent = { foo: function() {} };
var child = Object.create(parent);
console.log(parent.isPrototypeOf(child)); // true
```
在此示例中,我们使用 isPrototypeOf() 方法判断 parent 是否是 child 的原型对象。
6. 如何实现继承?
在 JavaScript 中,可以使用原型链实现继承。例如,我们可以创建一个名为 Parent 的构造函数,并在其原型对象上定义一些属性和方法:
```
function Parent() {
this.name = "parent";
}
Parent.prototype.sayHello = function() {
console.log("Hello, I'm " + this.name);
};
```
然后,我们可以创建一个名为 Child 的构造函数,并将其原型对象设置为 Parent 的实例,从而实现继承:
```
function Child() {}
Child.prototype = new Parent();
Child.prototype.constructor = Child;
var child = new Child();
child.name = "child";
child.sayHello(); // Hello, I'm child
```
在此示例中,我们创建了一个名为 Child 的构造函数,并将其原型对象设置为 Parent 的实例。这意味着 Child 可以继承 Parent 中的所有属性和方法,包括 sayHello 方法。最后,我们创建了一个名为 child 的 Child 实例,并修改了其 name 属性。调用 child.sayHello() 方法时,将输出 "Hello, I'm child"。
阅读全文