详解Javascript中的原型OOP

详解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 2023年6月10日
    00
  • Javascript实现html转pdf高清版(提高分辨率)

    让我来讲解一下Javascript实现html转pdf高清版的完整攻略。 1. 准备工作 在进行Javascript实现html转pdf高清版之前,需要准备以下工作: 安装Node.js环境,可以从Node.js官网下载安装; 安装相关的npm包,例如puppeteer和sharp,可以在命令行中执行以下命令进行安装: npm install puppete…

    JavaScript 2023年5月27日
    00
  • Javascript 对象(object)合并操作实例分析

    我来详细讲解一下 “Javascript 对象(object)合并操作实例分析” 的完整攻略,过程中包含两条示例说明。 1、 操作实例说明 在 JavaScript 开发中,我们经常需要将两个或多个对象合并为一个对象,这种操作就是对象的合并。常见的合并方式有浅合并和深合并两种方式。 1.浅合并:将多个对象合并为一个对象,如果属性名相同则直接覆盖原有属性即可。…

    JavaScript 2023年5月27日
    00
  • javascript时间排序算法实现活动秒杀倒计时效果

    让我详细讲解一下“javascript时间排序算法实现活动秒杀倒计时效果”的完整攻略。 1. 确定倒计时的结束时间 在开始编写代码之前,我们需要确定倒计时的结束时间。可以通过获取服务器时间来确保倒计时的准确性。 // 获取服务器时间,假设服务器返回的时间为 "2022-01-01 00:00:00" (UTC+8) let serverT…

    JavaScript 2023年5月27日
    00
  • 详细分析单线程JS执行问题

    好的。首先,我们来了解一下单线程JS执行问题。 JavaScript是一种单线程的语言,只能在一个主线程上执行。这意味着,JavaScript代码只能以串行的方式执行,也就是说,只能一个函数一个函数依次执行,不会出现多个函数同时运行的情况。 这样做有什么好处呢?一方面,可以避免多个线程之间的竞争和同步问题;另一方面,可以使代码的执行顺序更加明确和可控。 但同…

    JavaScript 2023年5月28日
    00
  • vue项目实例中用query传参如何实现跳转效果

    Vue项目中实现通过query传参跳转页面有以下两种方法: 方法一:使用router-link跳转页面 router-link是Vue Router提供的路由跳转组件,通过它可以实现页面之间的跳转,同时可以传递参数。下面是一个示例: <template> <router-link :to="{name: ‘detail’, que…

    JavaScript 2023年6月11日
    00
  • countUp.js实现数字滚动效果

    下面我将详细讲解“countUp.js实现数字滚动效果”的完整攻略。 什么是countUp.js countUp.js是一个轻量级的JavaScript库,它可以帮助开发者实现数字滚动效果,使数字以动画的形式逐步增加到目标值。 应用场景 countUp.js常用于数字计数器、数据统计、商品价格展示等需要数字动态变化的场景。 使用方法 步骤一:引入countU…

    JavaScript 2023年6月11日
    00
  • 结构型-代理模式

    定义   代理是一个中间者的角色,如生活中的中介,出于种种考虑/限制,一个对象不能直接访问另一个对象,需要一个第三者(中间代理)牵线搭桥从而间接达到访问目的,这样的就是代理模式。 es6 中的代理  es6 的 proxy 就是上面说的代理模式的实现,es6 帮我们在语法层面提供了这个新的api,让我们可以很轻松的就使用了代理模式。 const p = ne…

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