详解Javascript中的原型OOP

yizhihongxing

详解JavaScript中的原型OOP

什么是原型OOP

原型OOP是指JavaScript中通过原型链实现面向对象编程的方式。它利用每个JavaScript对象都有一个指向原型的指针,通过原型链可以实现继承和复用,从而实现面向对象编程的特性。

原型链

原型链是通过每个对象都有一个指向原型的指针,从而形成的链式结构。例如:

let animal = {
  eat: function() {
    console.log('I\'m eating.');
  }
};
let cat = {
  meow: function() {
    console.log('Meow.');
  }
};

cat.__proto__ = animal;

在这个例子中,我们创建了一个animal对象,并定义了一个eat方法。然后我们创建了一个cat对象,并定义了一个meow方法。接着,我们将cat的原型指向了animal对象。这样,cat对象就继承了animal对象的属性和方法。

构造函数

构造函数是一种特殊的函数,用于创建一个类。构造函数通过new关键字创建一个实例,这个实例可以访问构造函数中定义的属性和方法。例如:

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

let cat = new Animal('Kitty');
cat.eat(); // 输出 "Kitty is eating."

在这个例子中,我们定义了一个Animal构造函数,其中包含一个name属性和一个eat方法。然后,我们创建了一个cat实例。我们通过new关键字来调用构造函数,并把"Kitty"作为参数传入。最后,我们调用cat对象的eat方法,输出"Kitty is eating."

原型继承

原型继承是通过原型链实现的继承方式,它允许子类继承父类的属性和方法。例如:

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

function Cat(name) {
  Animal.call(this, name);
}
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;
Cat.prototype.meow = function() {
  console.log('Meow.');
};

let kitty = new Cat('Kitty');
kitty.eat(); // 输出 "Kitty is eating."
kitty.meow(); // 输出 "Meow."

在这个例子中,我们定义了一个Animal构造函数,它包含一个name属性和一个eat方法。接着,我们定义了一个Cat构造函数,它继承了Animal构造函数,并添加了一个meow方法。

我们通过Object.create函数来创建一个对象,这个对象的原型指向了Animal.prototype。然后我们将Cat.prototype指向了这个新的对象,这样就建立了Cat对象和Animal对象之间的原型链。最后,我们把Cat.prototype.constructor指向了Cat构造函数。

这样,Cat对象就成功地继承了Animal对象的name属性和eat方法,并添加了meow方法。我们创建一个kitty实例,并调用eatmeow方法,输出"Kitty is eating.""Meow."

示例1:实现类的继承

下面是另一个示例,展示了如何使用原型继承实现类的继承:

function Shape(x, y) {
  this.x = x;
  this.y = y;
}
Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
};

function Circle(x, y, r) {
  Shape.call(this, x, y);
  this.r = r;
}
Circle.prototype = Object.create(Shape.prototype);
Circle.prototype.constructor = Circle;

Circle.prototype.area = function() {
  return Math.PI * this.r * this.r;
};

let c = new Circle(0, 0, 5);
c.move(10, 10);
console.log(c.area()); // 输出 "78.53981633974483"

在这个例子中,我们定义了一个Shape构造函数,它有xy属性以及一个move方法。然后,我们定义了一个Circle构造函数,它继承了Shape构造函数,并添加了一个r属性以及一个area方法。

我们通过Object.create函数来创建一个对象,这个对象的原型指向了Shape.prototype。然后我们将Circle.prototype指向了这个新的对象,这样就建立了Circle对象和Shape对象之间的原型链。最后,我们把Circle.prototype.constructor指向了Circle构造函数。

这样,Circle对象就成功地继承了Shape对象的xy属性和move方法,并添加了r属性和area方法。我们创建一个c实例,并调用movearea方法,输出"78.53981633974483"

示例2:利用原型实现单例模式

下面是另一个示例,展示了如何利用原型实现单例模式:

let Singleton = (function() {
  let instance;

  function SingletonClass(name) {
    if (instance) {
      return instance;
    }
    instance = this;

    this.name = name;
  }

  SingletonClass.prototype.getName = function() {
    return this.name;
  };

  return SingletonClass;
})();

let a = new Singleton('A');
let b = new Singleton('B');

console.log(a.getName()); // 输出 "A"
console.log(b.getName()); // 输出 "A"
console.log(a === b); // 输出 "true"

在这个例子中,我们定义了一个SingletonClass构造函数,并使用一个闭包保存了实例对象。当我们通过new关键字创建一个实例的时候,我们首先检查实例对象是否存在。如果实例对象已经存在,直接返回该对象。否则,我们就创建一个新的实例对象,并保存在闭包内。这样,我们的SingletonClass构造函数就变成了单例模式。

我们将getName方法添加到SingletonClass原型中,并在创建实例之后,我们可以通过getName方法来获取实例的name属性。这样,我们就实现了利用原型实现的单例模式。

我们创建了ab两个实例,并分别调用getName方法,输出"A"。然后我们比较ab是否相等,输出"true",这是因为ab都指向同一个实例对象。

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

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

相关文章

  • JavaScript的兼容性与调试技巧

    一、JavaScript的兼容性 在编写JavaScript代码时,我们需要考虑不同浏览器的兼容性。不同的浏览器可能会对同一个JavaScript代码有不同的解析方式,从而导致代码在某些浏览器中无法正常运行。为了解决这个问题,我们需要做一些兼容性处理。 使用polyfill库 Polyfill是一个用于实现浏览器尚未原生支持的Web API的脚本。通过使用P…

    JavaScript 2023年5月28日
    00
  • JavaScript之信息的封装 js对象入门

    下面是针对“JavaScript之信息的封装 js对象入门”的完整攻略: 什么是信息封装 信息封装是一种数据抽象的方式,可以隐藏数据的具体实现细节,只暴露对外的接口部分。通过这种方式来达到保护数据的目的,同时也可以控制对数据的访问权限。 JavaScript 中可以通过对象来实现信息封装,具体实现方式是通过定义对象的属性和方法,来封装对象的数据和行为。 Ja…

    JavaScript 2023年5月19日
    00
  • 跟我学习javascript的异步脚本加载

    下面我就为您详细讲解“跟我学习javascript的异步脚本加载”的完整攻略。 前言 网页应用程序通常需要使用JavaScript来实现复杂的交互逻辑。JavaScript是一种单线程语言,当代码需要联网或执行耗时操作时,会出现页面阻塞的现象,这就导致了JavaScript执行速度直接影响到用户的交互体验。因此,为了解决这个问题,JavaScript提供了一…

    JavaScript 2023年5月27日
    00
  • JFinal使用ajaxfileupload实现图片上传及预览

    以下是使用 JFinal 和 ajaxfileupload 实现图片上传及预览的完整攻略。 准备工作 首先,你需要在你的项目中引入 JFinal 和 ajaxfileupload,具体引入方式可以参考官方文档。 接着,你需要准备一个接口用于接收上传的图片,并返回图片的路径或其他信息,可以在你的 JFinal Controller 中编写一个如下的示例方法: …

    JavaScript 2023年6月11日
    00
  • 一些你可能不熟悉的JS知识点总结

    一些你可能不熟悉的JS知识点总结 理解JS中的this指向 在 Javascript 中,“this”是一个关键字,它指向函数执行时的上下文对象。在全局作用域中,“this”指向全局对象(window / global),在函数内部,“this”指向函数调用时的“拥有者”(即调用该函数的对象)。更多的用法和示例请参考以下代码: let obj = { nam…

    JavaScript 2023年5月28日
    00
  • JavaScript数组操作总结

    JavaScript数组操作总结 什么是JavaScript数组 JavaScript数组是一种可以存储一组有序数据的容器,它可以存储任何类型的数据并可以通过索引来访问。在JavaScript中创建一个数组非常简单,只需要使用方括号[]将数据项封装起来,每个数据项之间使用逗号分隔。 let arr = [1, ‘hello’, true, 3.14]; 数组…

    JavaScript 2023年5月17日
    00
  • js图片上传中file、bolb、base64图片之间的相互转化

    为了详细讲解“js图片上传中file、bolb、base64图片之间的相互转化”的完整攻略,我们需要分别了解它们都代表着什么,以及相互之间的转换方式: File类型 File类型表示一个文件,通常是从用户计算机中选定的文件。File对象通常与input元素一起使用,而用于上传文件。File对象包含了文件的名称、文件大小、类型以及最后修改的时间等信息。 将Fi…

    JavaScript 2023年5月27日
    00
  • js向上无缝滚动,网站公告效果 具体代码

    下面我将详细讲解如何实现JavaScript向上无缝滚动网站公告效果,包括代码实现和调试过程。 1. 准备工作 在开始实现之前,需要先准备好一些基本的HTML和CSS代码。首先创建一个包含公告内容的DIV,将其设置为固定高度,并添加必要的样式,使其看起来更加美观。 <div class="notice"> <ul>…

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