详解JavaScript原型与原型链

详解JavaScript原型与原型链

前置知识

在深入讲解JavaScript原型与原型链之前,需要了解以下概念:

  • 对象
  • 构造函数
  • 实例
  • 继承

原型

JavaScript中有一个对象,称为原型对象(prototype object),它指向一个JavaScript对象。每个JavaScript对象都有一个原型对象。

在对象定义时,可以通过Object.create()方法,创建一个新对象,并指定newObject的原型对象为someObject

var someObject = {
  a: 1
};

var newObject = Object.create(someObject);

在上述代码中,newObject的原型对象为someObject

原型链

原型对象也可以有自己的原型。这种关系可以形成链状结构,被称作原型链(prototype chain)。

如果在一个对象中查找属性或方法时,找不到,它会沿着原型链一直向上查找,直到找到匹配的属性或方法或者查找到原型链的顶部,也就是Object.prototype为止,如果在整个原型链上都没找到,返回undefined。

构造函数

构造函数(constructor)是通过new关键字创建对象的特殊函数。构造函数可以用来创建特定类型的对象,相当于类的概念。

在构造函数中,可以使用this关键字给对象添加属性和方法,同时可以使用new关键字创建实例。

function Person(name) {
  this.name = name;
}

var p = new Person('张三');

在上述代码中,Person可以看作是一个构造函数,可以通过new关键字创建实例。p就是一个实例。

实例属性与原型属性

构造函数中定义的属性和方法,每一个实例都有一个独立的副本,称之为实例属性或方法。而通过原型对象定义的属性和方法,则被所有实例共享,称之为原型属性或方法。

function Person(name) {
  this.name = name;
}

Person.prototype.sayHello = function() {
  console.log('Hello');
};

var p = new Person('张三');
var q = new Person('李四');

p.sayHello(); // 输出 'Hello'
q.sayHello(); // 输出 'Hello'

在上述代码中,sayHello方法是定义在Person的原型对象上的,所以被所有实例共享。

对象继承

要实现继承,需要使用到原型链。

在JavaScript中,每个对象都有一个原型对象,可以通过重写对象的原型对象来实现继承。我们可以通过构造函数中的Object.create方法,将父类的原型对象作为参数传入,生成一个新的对象,将这个新的对象作为子类的原型对象。

function Person(name) {
  this.name = name;
}

Person.prototype.sayHello = function() {
  console.log('Hello');
};

function Student(name, grade) {
  Person.call(this, name);
  this.grade = grade;
}

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

Student.prototype.sayGoodbye = function() {
  console.log('Goodbye');
};

var s = new Student('张三', '大一');

s.sayHello(); // 输出 'Hello'
s.sayGoodbye(); // 输出 'Goodbye'

在上述代码中,Person是父类,Student是子类,Student通过Object.create(Person.prototype)来实现继承。

示例说明

示例1

现在有一个 Car 构造函数,它的原型对象上有一个 brand 属性,同时原型对象上还有一个 run 方法,可以让汽车行驶。现在我们创建了一个 Honda 的实例,用 console.log 依次输出它的属性和方法。

function Car() {}

Car.prototype.brand = 'Honda';

Car.prototype.run = function() {
  console.log('The car is running');
};

var honda = new Car();

console.log(honda.brand); // 输出 'Honda'
honda.run(); // 输出 'The car is running'

在上面的代码中,hondaCar 的一个实例,它继承了 Car 的原型对象上的 brand 属性和 run 方法。

示例2

现在有一个 Animal 构造函数,它拥有一个 type 属性。我们需要编写一个 Cat 构造函数,使它继承 Animal,同时为 Cat 添加一个 name 属性。创建两个 Cat 的实例,用 console.log 依次输出它们的属性。

function Animal() {}

Animal.prototype.type = '动物';

function Cat(name) {
  this.name = name;
}

Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;

var cat1 = new Cat('小白');
var cat2 = new Cat('小黑');

console.log(cat1.type); // 输出 '动物'
console.log(cat1.name); // 输出 '小白'

console.log(cat2.type); // 输出 '动物'
console.log(cat2.name); // 输出 '小黑'

在上述代码中,Cat 通过 Object.create(Animal.prototype) 来实现继承 Animal 的原型对象,并重写它的构造函数。cat1cat2Cat 的两个实例,它们都拥有 Animaltype 属性和 Catname 属性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JavaScript原型与原型链 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • js删除数组中的元素delete和splice的区别详解

    JS删除数组中的元素delete和splice的区别详解 在JavaScript中,删除数组元素有两种常见的方法:delete和splice。虽然它们都可以删除数组元素,但使用方法和功能上还是有一些差别的。下面我们就来详细讲解一下它们的区别。 delete方法 delete方法用于删除数组元素,实际上是将该元素的值赋为undefined。它的语法如下: de…

    JavaScript 2023年5月27日
    00
  • 兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码

    若要开发一个能够在IE、FireFox、Chrome等浏览器上兼容的xml处理函数js代码,我们可以采用以下步骤: 创建一个xml解析函数 我们可以使用XMLHttpRequest对象来解析xml文件。不同的浏览器对这个对象的支持程度不同,所以我们需要在代码中加入相关兼容性的判断语句,以保证代码的兼容性。以下是一个兼容IE、FireFox、Chrome的xm…

    JavaScript 2023年5月27日
    00
  • Javascript中replace()小结

    当我们在Javascript中需要进行字符串的替换操作时,可以使用字符串内置的replace()方法。replace()方法接受两个参数,第一个参数是要替换的字符串或正则表达式,第二个参数是用于替换的新字符串。 下面是replace()的基本语法: string.replace(searchvalue, newvalue) 其中: searchvalue:要…

    JavaScript 2023年5月28日
    00
  • 基于JS实现01支付后的10秒倒计时

    要实现基于JS的10秒倒计时,可以采用以下步骤: 1.在HTML中创建倒计时显示元素 首先,在HTML中创建一个元素用于显示倒计时,例如: <div id="countdown">10</div> 这是一个div元素,给它一个id,方便在JS中获取并修改其内容。 2.利用JS实现倒计时功能 然后,在JS中获取倒计时…

    JavaScript 2023年6月11日
    00
  • JS+Canvas绘制抽奖转盘

    下面是详细讲解“JS+Canvas绘制抽奖转盘”的完整攻略: 一、准备工作 创建 HTML 文件并引入 Canvas(例如:) 获取 Canvas 对象,创建绘图上下文和 Canvas 尺寸 定义需要用到的变量(例如:奖项,概率,角度,旋转速度等) 二、绘制转盘基本结构和奖项 绘制转盘外圆和内圆 绘制奖项扇形,并填充不同的颜色 三、转盘动画 绑定旋转事件(例…

    JavaScript 2023年6月11日
    00
  • asp.net 实现下拉框只读功能

    当我们在 ASP.NET 中使用下拉框时,有时希望该下拉框在不禁用的情况下变为只读状态,这意味着用户仍然可以查看下拉框内容,但不能更改内容。以下是 ASP.NET 实现下拉框只读功能的攻略: 步骤一:使用 ASP.NET 的 DropDownList 控件 要实现下拉框的只读功能,需要在 ASP.NET 中使用 DropDownList 控件。我们可以在 .…

    JavaScript 2023年6月11日
    00
  • JavaScript基本类型值-Number类型

    JavaScript基本类型值-Number类型 Number类型概述 JavaScript中的Number类型用于表示数字,在JavaScript中,整数、小数、负数等都可以用Number类型表示。 Number类型的创建方式 可以使用以下方式创建Number类型: 直接使用数字赋值,如:var num = 123; 使用Number函数创建Number对…

    JavaScript 2023年6月10日
    00
  • 基于JS实现带并发限制的异步调度器

    下面我将详细讲解“基于JS实现带并发限制的异步调度器”的完整攻略。 首先,我们需要明确“异步调度器”的定义。它是用于管理和控制异步任务执行的工具,常见的应用场景有批量请求处理、网络爬虫、图片下载等。为了避免过度并发导致系统资源的浪费,我们需要对任务的并发量进行限制,这就需要实现一个带并发限制的异步调度器。 接下来,我们将介绍如何利用JavaScript实现带…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部