JavaScript原型与原型链深入探究使用方法

yizhihongxing

JavaScript原型与原型链深入探究使用方法

原型

JavaScript中每个函数都有一个prototype属性,它指向一个对象。这个对象就是所谓的“原型对象”或“原型”。我们可以在原型对象上添加方法和属性,这些方法和属性可以被构造函数创建的实例所共享。在原型对象上定义的方法和属性,可以被该构造函数所创建的所有实例共享使用。这样,我们就可以省略实例中相同的方法和属性了。

我们可以使用Object.getPrototypeOf()方法获取指定对象的原型对象,或者使用对象的__proto__属性获取其原型对象。

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

Person.prototype.sayHello = function() {
  console.log("Hello, I'm " + this.name + " and I'm " + this.age + " years old.");
};

var p1 = new Person("Alice", 23);
var p2 = new Person("Bob", 24);

p1.sayHello(); // Hello, I'm Alice and I'm 23 years old.
p2.sayHello(); // Hello, I'm Bob and I'm 24 years old.

console.log(Object.getPrototypeOf(p1) === Person.prototype); // true
console.log(p1.__proto__ === Person.prototype); // true

原型链

JavaScript中除了Object对象没有原型,其他所有对象都有原型。当我们访问对象的一个属性时,JavaScript引擎会首先在该对象本身查找该属性,如果找到则直接返回该属性的值;如果没有找到,则继续在该对象的原型对象上查找该属性。如果仍然没有找到,则继续在原型对象的原型对象上查找,直到找到该属性或到达Object为止。

这种由多个对象构成的链式结构就是原型链。我们可以使用Object.create()方法来创建一个指定对象的新对象,并把新对象的原型对象指定为该指定对象,从而形成一个原型链。

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

Person.prototype.sayHello = function() {
  console.log("Hello, I'm " + this.name + " and I'm " + this.age + " years old.");
};

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

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.sayGrade = function() {
  console.log(this.name + "'s grade is " + this.grade + ".");
};

var s1 = new Student("Alice", 23, "A");
var s2 = new Student("Bob", 24, "B");

s1.sayHello(); // Hello, I'm Alice and I'm 23 years old.
s1.sayGrade(); // Alice's grade is A.
s2.sayHello(); // Hello, I'm Bob and I'm 24 years old.
s2.sayGrade(); // Bob's grade is B.

console.log(Object.getPrototypeOf(s1) === Student.prototype); // true
console.log(Object.getPrototypeOf(Student.prototype) === Person.prototype); // true
console.log(Object.getPrototypeOf(Person.prototype) === Object.prototype); // true
console.log(Object.getPrototypeOf(Object.prototype) === null); // true

在上面的示例中,使用Object.create()方法创建了一个新对象,并把原型对象指定为Person.prototype,从而形成了一个原型链。由于我们重写了Student.prototype对象,导致其原型对象不再指向Object.prototype,所以要手动给Student.prototype重新设置constructor属性。在该原型链中,Student的实例Student.prototype的原型对象是Person.prototypePerson的实例的原型对象是Object.prototype,最高层原型对象是null。为了提高代码的可读性,我们可以使用ES5中新增的Object.setPrototypeOf()方法来设置对象的原型对象。

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

Person.prototype.sayHello = function() {
  console.log("Hello, I'm " + this.name + " and I'm " + this.age + " years old.");
};

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

Object.setPrototypeOf(Student.prototype, Person.prototype);
Student.prototype.sayGrade = function() {
  console.log(this.name + "'s grade is " + this.grade + ".");
};

var s1 = new Student("Alice", 23, "A");
var s2 = new Student("Bob", 24, "B");

s1.sayHello(); // Hello, I'm Alice and I'm 23 years old.
s1.sayGrade(); // Alice's grade is A.
s2.sayHello(); // Hello, I'm Bob and I'm 24 years old.
s2.sayGrade(); // Bob's grade is B.

console.log(Object.getPrototypeOf(s1) === Student.prototype); // true
console.log(Object.getPrototypeOf(Student.prototype) === Person.prototype); // true
console.log(Object.getPrototypeOf(Person.prototype) === Object.prototype); // true
console.log(Object.getPrototypeOf(Object.prototype) === null); // true

示例说明

示例一

在以下示例中,我们定义了一个Animal的构造函数,该构造函数拥有一个eat方法的原型。我们接着从Animal继承一个Dog构造函数,并通过原型链给Dog添加一个bark方法。最后,使用Dog构造函数创建了一个d对象。我们可以发现,d可以调用eatbark两个方法。

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

Animal.prototype.eat = function() {
    console.log(this.name + " is eating.");
};

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

Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.bark = function() {
    console.log(this.name + " is barking.");
};

var d = new Dog("Gunner");
d.eat();
d.bark();

示例二

在以下示例中,我们定义了一个Shape的构造函数,该构造函数拥有一个getType方法的原型。我们接着从Shape继承一个Rectangle构造函数,并重写了该构造函数的getType方法来返回特定的type属性。最后,使用Rectangle构造函数创建了一个r对象。我们可以发现,rgetType方法返回了rectangle

function Shape() { }

Shape.prototype.getType = function() {
    return "shape";
}

function Rectangle() { }

Rectangle.prototype = Object.create(Shape.prototype);

Rectangle.prototype.constructor = Rectangle;

Rectangle.prototype.getType = function() {
    return "rectangle";
}

var r = new Rectangle();
console.log(r.getType());

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript原型与原型链深入探究使用方法 - Python技术站

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

相关文章

  • fastclick插件导致日期(input[type=”date”])控件无法被触发该如何解决

    首先,需要梳理一下问题的背景和现象: 背景:当网页中使用了fastclick插件时 现象:用户在点击日期选择控件时,控件无法弹出日期选择框,无法选择日期。 这是因为fastclick插件会阻止浏览器默认的双击事件(有些日期选择控件在点击两次时才能弹出)和移动端的300ms延迟,从而提升点击体验。然而这个插件的实现方式是,将点击事件改为tap事件,从而可能会对…

    JavaScript 2023年6月11日
    00
  • JavaScript中Webpack的使用教程

    下面我将为您详细讲解JavaScript中Webpack的使用教程的完整攻略。 什么是Webpack? Webpack是一个现代JavaScript应用程序的静态模块打包器。当Webpack处理您的应用程序时,它会递归地构建一个依赖关系图,这个依赖关系图包含了您应用程序的每个模块,并生成一个或多个凝结在一起的bundle。 Webpack需要理解以下四个核心…

    JavaScript 2023年5月27日
    00
  • JS实现探测网站链接的方法【测试可用】

    非常感谢您对该篇文章的关注和探究。本篇文章将详细介绍如何通过JS实现探测网站链接的方法。 前言 在现代Web开发中,许多应用程序都需要通过链接访问其他资源。尤其是在网站开发中,网站链接是非常常用的功能之一。那么如何通过JS实现对链接的探测呢?在本文中,我们将答疑解惑,为您提供一份可实践的完整攻略。 准备工作 为了实现探测链接的功能,首先需要准备一下所需的工具…

    JavaScript 2023年6月11日
    00
  • JavaScript的parseInt 取整使用

    下面是关于JavaScript中parseInt方法的取整使用的完整攻略: 什么是 parseInt 方法 parseInt 方法是 JavaScript 内置的一个函数,用来将一个字符串转换成整数(Number)。 它的语法格式如下: parseInt(string, radix) 其中: string:需要转换成整数的字符串。 radix:可选,表示转换…

    JavaScript 2023年5月28日
    00
  • JS动态创建Table,Tr,Td并赋值的具体实现

    下面是“JS动态创建Table,Tr,Td并赋值的具体实现”的攻略。 实现方法 使用JavaScript可以很方便地动态创建表格,具体步骤如下: 创建一个 元素,用于存放动态创建的表格。 使用JavaScript的循环语句,例如for循环或while循环,根据需要动态创建需要的行(tr)和列(td)。 在创建每个行(tr)时,使用循环语句动态创建所需的列(t…

    JavaScript 2023年6月11日
    00
  • JS实现生成由字母与数字组合的随机字符串功能详解

    下面是详细的攻略: 1. 开发思路 生成随机字符串的最基本思路是,在一定的字符集中随机选取一些字符,然后按照一定顺序排列生成字符串。对于字符集的选择,我们可以限定在数字、小写字母、大写字母三类字符中,并且可以根据具体需求自定义字符集。然后利用 JavaScript 中的 Math.random() 函数来实现字符的随机选择,最后将所选的字符组合在一起形成随机…

    JavaScript 2023年5月28日
    00
  • ajax响应json字符串和json数组的实例(详解)

    下面是“ajax响应json字符串和json数组的实例(详解)”的攻略: 1. 理解何为JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。JSON 是 JavaScript 对象的字符串表示,因此它得名为 JSON。 在 JSON 格式中,数据以名称/值对的形式进行存…

    JavaScript 2023年5月27日
    00
  • 谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)

    JSON是一种轻量级的数据交换格式,提供了在不同编程语言之间交换数据的标准格式。在JavaScript中,JSON对象提供了一种方便的方式将JavaScript对象转换成JSON格式的字符串或者将JSON格式的字符串转换成JavaScript对象。而JSON.stringify()和JSON.parse()就是这两种转换方式。 JSON.stringify(…

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