【js面试题】js原型,原型链?有什么特点

在 JavaScript 中,原型(Prototype)和原型链(Prototype Chain)是实现继承和共享属性与方法的核心机制。理解它们对于深入掌握 JavaScript 的对象模型非常重要。

原型(Prototype)

每个 JavaScript 对象都拥有一个原型对象,它包含可以由该对象的所有实例共享的属性和方法。原型对象自身也有一个原型,层层上溯,直到达到 null,形成一个“原型链”。

特点:
  1. 共享属性和方法:对象的原型允许不同实例共享相同的属性和方法,减少内存占用。
  2. 动态性:JavaScript 的原型是动态的,即使原型对象在创建实例之后被修改,实例也会反映这些变化。
  3. 继承:通过原型链,JavaScript 实现了基于原型的继承机制。
    在这里插入图片描述

示例:

// 定义一个构造函数
function Car(make, model) {
    this.make = make;
    this.model = model;
}

// 使用原型添加一个方法,所有 Car 实例都会共享这个方法
Car.prototype.displayInfo = function() {
    console.log(`This car is a ${this.make} ${this.model}.`);
};

// 创建两个 Car 实例
let car1 = new Car('Toyota', 'Corolla');
let car2 = new Car('Ford', 'Mustang');

// 调用原型上的方法
car1.displayInfo(); // 输出: This car is a Toyota Corolla.
car2.displayInfo(); // 输出: This car is a Ford Mustang.

//使用 hasOwnProperty 方法检查 displayInfo 是否为 car1 的自有属性
console.log(car1.hasOwnProperty('displayInfo')); // 输出: false,因为 displayInfo 是原型上的方法

原型链(Prototype Chain)

原型链是连接对象和其原型的链表结构,它从对象开始,逐级向上直到 Object.prototype,最终达到 null

特点:
  1. 属性查找:当访问一个对象的属性时,JavaScript 会首先在对象本身上查找,如果没有找到,会沿着原型链向上查找,直到找到该属性或到达链的末端。
  2. 继承:通过原型链,子对象可以继承父对象的属性和方法。

用例

让我们通过一个例子来理解原型链的概念。我们将创建几个对象,并通过原型链实现继承。

// 定义一个基础构造函数
function Animal(name) {
    this.name = name;
}

// 为 Animal 的原型添加一个方法
Animal.prototype.speak = function() {
    console.log(`${this.name} makes a noise.`);
};

// 定义一个继承自 Animal 的构造函数
function Dog(name, breed) {
    // 调用父构造函数,实现属性继承
    Animal.call(this, name);
    this.breed = breed;
}

// 设置 Dog 的原型为 Animal 的一个实例,实现方法继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修正构造函数指向

// 为 Dog 添加特有的方法
Dog.prototype.bark = function() {
    console.log(`${this.name} barks.`);
};

// 创建一个 Dog 实例
let myDog = new Dog('Rex', 'Labrador');

// 调用继承自 Animal 的方法
myDog.speak(); // 输出: Rex makes a noise.

// 调用 Dog 自己的方法
myDog.bark(); // 输出: Rex barks.

// 检查原型链
console.log(myDog instanceof Animal); // true
console.log(myDog instanceof Dog); // true
console.log(myDog instanceof Object); // true

解释

  1. 基础构造函数 Animal:定义了一个 Animal 构造函数和一个原型方法 speak
  2. 派生构造函数 Dog:定义了一个 Dog 构造函数,它继承自 Animal。使用 Animal.call(this, name) 来调用父构造函数,确保 Dog 实例拥有 Animal 的属性。
  3. 设置原型链:通过 Dog.prototype = Object.create(Animal.prototype),我们创建了一个新的对象,其原型是 Animal.prototype。这样,Dog 的实例就可以访问 Animal 原型上的方法了。同时,我们修正了 Dog.prototype.constructor 以指向 Dog 构造函数。
  4. 添加特有方法:为 Dog 添加了一个特有的方法 bark
  5. 创建实例并调用方法:创建了一个 Dog 的实例 myDog,并调用了继承自 Animalspeak 方法和 Dog 自己的 bark 方法。
  6. 检查原型链:通过 instanceof 操作符,我们可以看到 myDogAnimalDogObject 的实例,这说明了原型链的继承关系。

在这里插入图片描述

使用场景

  • 共享方法:当你希望多个对象共享同一个方法或属性时,可以将它们放在原型上。
  • 实现继承:通过修改或扩展对象的原型,可以实现继承机制,允许子对象访问父对象的方法和属性。
  • 检测属性来源:当需要确定一个属性是对象自身的还是继承自原型链时,可以使用 hasOwnProperty 方法。

总结

原型和原型链是 JavaScript 中实现对象继承和属性共享的核心机制。通过原型链,对象可以继承其构造函数的原型对象上的属性和方法。理解原型链对于编写高效且可维护的 JavaScript 代码至关重要。在实际开发中,合理利用原型和原型链可以优化内存使用,实现复杂的继承结构,并且有助于深入理解 JavaScript 的对象模型。

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。以下是一些JS原型继承和原型链面试题及其答案: 1. 什么是原型继承? 答:原型继承是通过将一个对象的原型作为另一个对象的原型来实现继承。在JS中,每个对象都有一个原型,它可以通过__proto__属性来访问。 2. 什么是原型链? 答:原型链是一种通过原型继承来实现对象间继承关系的机制。当我们访问一个对象的属性时,JS会首先在该对象自身查找,如果没有找到,就会在它的原型对象上查找,如果还没有找到,就会在原型对象的原型对象上查找,一直到Object.prototype对象为止,这个查找的过程就是原型链。 3. 如何实现一个简单的原型继承? 答: ```javascript function Person(name) { this.name = name; } Person.prototype.sayHi = function() { console.log('Hi, my name is ' + this.name); } function Student(name, grade) { Person.call(this, name); this.grade = grade; } Student.prototype = Object.create(Person.prototype); Student.prototype.constructor = Student; Student.prototype.sayGrade = function() { console.log('My grade is ' + this.grade); } var tom = new Student('Tom', 3); tom.sayHi(); tom.sayGrade(); ``` 4. 如何判断一个对象是否是另一个对象的实例? 答:可以使用instanceof运算符来判断,例如: ```javascript var obj = {}; console.log(obj instanceof Object); // true ``` 5. 如何判断一个属性是在对象自身定义的还是继承自原型? 答:可以使用JS提供的hasOwnProperty方法来判断,例如: ```javascript var obj = {}; console.log(obj.hasOwnProperty('toString')); // false console.log(Object.prototype.hasOwnProperty('toString')); // true ``` 希望这些问题和答案能够帮助你更好地理解JS原型继承和原型链
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值