浅谈JS的原型和继承

yizhihongxing

浅谈JS的原型和继承

1. 原型

在JavaScript中,每个对象都有一个原型对象,它充当了该对象的基础。原型对象是一个普通的对象,用于存储对象所继承的属性和方法。

我们可以使用Object.getPrototypeOf(obj)方法获取一个对象的原型。

var obj = {};
console.log(Object.getPrototypeOf(obj)); //输出:Object {}

这里输出的是一个空对象,也就是Object构造函数的原型对象。

对象实例可以通过__proto__属性来访问它的原型对象。这里需要注意的是,__proto__只是一种访问原型对象的方式,尽量不要直接使用它去修改原型对象。在ES6中,__proto__属性已经被标准化为Object.setPrototypeOf()Object.getPrototypeOf()方法。

var obj = {};
console.log(obj.__proto__); //输出:Object {}
console.log(Object.getPrototypeOf(obj)); //输出:Object {}

我们还可以使用Object.create(proto)方法来创建具有指定原型的新对象。

var protoObj = {
  welcome: function() {
    console.log("Welcome to Prototype Inheritance Demo!");
  }
}
var obj = Object.create(protoObj); //新建一个继承了protoObj的对象
obj.welcome(); //输出:Welcome to Prototype Inheritance Demo!

以上是原型的基础知识。

2. 继承

在JavaScript中,对象可以通过原型链来实现继承。当我们访问一个对象的属性或方法时,JavaScript会从该对象开始,沿着原型链向上查找,直到找到属性或方法或到达原型链的末尾为止。如果最终仍然没有找到,则返回undefined

var protoObj = {
  name: "Proto"
};
var obj = Object.create(protoObj);
console.log(obj.name); //输出:Proto

这里,obj继承了protoObjname属性。

在实际开发中,我们通常会使用构造函数来创建对象,构造函数中的this指向的就是新建立的对象。我们可以将一些共有属性和方法添加到构造函数原型对象上,这些属性和方法可以被该构造函数创建的所有对象所共享。

function Person(name) {
  this.name = name;
}
Person.prototype.sayName = function() {
  console.log("My name is " + this.name);
}
var p1 = new Person("Tom");
var p2 = new Person("Jerry");
p1.sayName(); //输出:My name is Tom
p2.sayName(); //输出:My name is Jerry

这里,Person构造函数的原型对象有一个sayName方法,它可以被所有通过Person构造函数创建出的对象所共享。

JavaScript的继承是通过原型链(prototype chain)来实现的。当我们创建一个新的对象时,可以使用Object.create(proto)方法来指定该对象的原型。

当我们访问对象的某个属性或方法时,如果该对象本身没有该属性或方法,JavaScript会沿着原型链向上查找,直到找到为止。

例如,我们定义一个Rectangle对象,它有widthheight属性,还有一个getArea()方法,用于计算矩形的面积。

function Rectangle(width, height) {
  this.width = width;
  this.height = height;
}
Rectangle.prototype.getArea = function() {
  return this.width * this.height;
}

如果我们想创建一个正方形对象,可以通过继承Rectangle对象来实现,如下所示:

function Square(side) {
  Rectangle.call(this, side, side);
}
Square.prototype = Object.create(Rectangle.prototype);
Square.prototype.constructor = Square;

在上面的代码中,通过调用Rectangle构造函数的call方法,在Square构造函数中创建了一个新的Rectangle对象,再将该对象的widthheight属性都设置为side,从而创建了一个新的正方形对象。然后,我们通过使用Object.create方法来创建一个继承了Rectangle.prototype的新对象,并将其设置为Square.prototype。最后将Square的构造函数设置回Square.prototype.constructor

现在我们可以创建一个正方形对象并调用它的getArea()方法:

var square = new Square(5);
console.log(square.getArea()); //输出:25

以上就是JavaScript原型和继承的基础知识以及一个继承的示例,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈JS的原型和继承 - Python技术站

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

相关文章

  • JS中关于事件处理函数名后面是否带括号的问题

    在JS中,事件处理函数名后面是否带括号是比较普遍的问题。如果没有括号,那么事件处理函数不会立即执行,而是当事件被触发时才会执行;如果有括号,那么事件处理函数会立即执行,而不是等到事件被触发。 下面,我们来一步步解析该问题。 一、JS事件处理函数 在JS中,要处理事件可以用以下两种方式: 在HTML元素中直接指定事件处理函数。 示例代码: <button…

    JavaScript 2023年6月10日
    00
  • 深入理解JavaScript系列(31):设计模式之代理模式详解

    深入理解JavaScript系列(31):设计模式之代理模式详解 概述 代理模式是一种结构型模式,其中一个对象充当另一个对象的接口,以控制对该对象的访问。 这种类型的设计模式属于结构模式,它对对象进行组合,以提供新的功能,同时使代码更易于维护。 在 JavaScript 中,代理模式允许我们在运行时动态地创建对象并控制其行为。 代理可以隔离对实际对象的访问,…

    JavaScript 2023年6月11日
    00
  • 复制js对象方法(详解)

    复制JS对象是很常见的操作,但是需要注意的是,在JS中,对象是引用类型,因此直接复制对象会导致对象引用被复制,而不是对象本身。这里介绍几种复制JS对象的方法,包括深拷贝和浅拷贝。 浅拷贝 浅拷贝可以简单地理解为将对象的属性复制一份到新的对象中,但是属性值为对象的属性仍然是引用关系。 表达式“{…obj}” ES6中引入了表达式“{…obj}”,可以用…

    JavaScript 2023年5月27日
    00
  • PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)

    PHP入门教程之正则表达式基本用法实例详解 什么是正则表达式? 正则表达式是一种字符串匹配的模式,它被广泛应用于各种编程语言中,例如PHP、JavaScript等。正则表达式描述了一种字符串的模式,让我们可以用这个模式去匹配或者搜索文本数据,从而达到我们所期望的结果。 正则表达式基本语法 字符类 []: 字符类是正则表达式中最基本的概念。它可以匹配一组字符中…

    JavaScript 2023年6月10日
    00
  • Javascript constructor 属性

    以下是关于JavaScript constructor属性的完整攻略。 JavaScript constructor属性 在JavaScript中,每个对象都有一个constructor属性,它指向创建该对象的构造函数。constructor属性是一个函数,用于创建该对象的实例。当我们创建一个对象,JavaScript会自动为该对象添加constructor…

    JavaScript 2023年5月11日
    00
  • JS内置对象和Math对象知识点详解

    JS内置对象和Math对象知识点详解 1. JS内置对象 JavaScript内置对象是指ecmaScript规范定义的对象,这些对象全局可用。JS内置对象不需要额外定义就可以直接使用,并且拥有丰富的API。 1.1. 常见的JS内置对象 以下是一些常见的JS内置对象: String 对象用于处理文本字符串 Number 对象用于处理数字 Object 对象…

    JavaScript 2023年5月28日
    00
  • 使用js获取地址栏中传递的值

    想要使用 JavaScript 获取地址栏中的传参,可以通过以下两种方式实现: 方法一:使用 window.location.search 获取查询字符串 地址栏的查询字符串可以使用 window.location.search 属性获取。查询字符串以问号(?)开头,其后紧跟着以 & 符号分隔的多个键值对,例如:http://www.example.…

    JavaScript 2023年6月11日
    00
  • 深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解

    深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解 什么是依赖倒置原则DIP? 依赖倒置原则(Dependency Inversion Principle,DIP)是S.O.L.I.D原则中的一个重要原则。该原则的核心思想是:高层模块不应该依赖于低层模块,二者都应该依赖于抽象接口。同时,抽象接口不应该依赖于具体实现,…

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