沃梦达 / IT编程 / 前端开发 / 正文

JavaScript中的prototype使用说明

JavaScript中的prototype是指每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。当使用该函数创建一个对象时,对象的__proto__指针会指向该函数的prototype属性所指向的对象。这意味着在该对象上调用该函数时,该函数中定义的所有方

JavaScript中的prototype是指每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。当使用该函数创建一个对象时,对象的__proto__指针会指向该函数的prototype属性所指向的对象。这意味着在该对象上调用该函数时,该函数中定义的所有方法和属性都可以在该对象上使用。

下面我们来详细说明一下prototype的使用方式和具体示例。

使用方式

1. 添加方法或属性

我们可以使用prototype来为已有函数添加新的方法或属性,这在一些框架和库中经常用到,如下示例:

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

Person.prototype.sayHello = function() {
  console.log('Hello, ' + this.name);
}

var person = new Person('Tom');
person.sayHello(); // 输出:Hello, Tom

上述代码中,我们使用prototype给Person函数添加了一个sayHello方法,该方法可以在所有Person的实例中使用,不需要为每个实例都手动添加。

2. 继承

使用prototype还可以实现JavaScript中的继承,如下示例:

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

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

function Dog(name, age) {
  Animal.call(this, name);
  this.age = age;
}

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

Dog.prototype.sayAge = function() {
  console.log('I am ' + this.age + ' years old');
}

var dog = new Dog('Jack', 3);
dog.sayName(); // 输出:My name is Jack
dog.sayAge(); // 输出:I am 3 years old

上述代码中,我们定义了两个构造函数Animal和Dog,其中Dog继承自Animal。使用prototype,我们给Animal和Dog分别添加了sayName和sayAge方法。最后创建一个实例dog,可以调用这两个方法。

示例说明

示例一:使用prototype实现大数加法

JavaScript中对于并不是很大的数字的加法是可以直接使用+运算符实现的,但是对于超过Number.MAX_SAFE_INTEGER(9007199254740991)的数字加法,我们需要使用各种方式实现。下面我们可以使用prototype实现大数加法,示例如下:

function BigNumber(n) {
  this.num = n.toString().split('').reverse().map(Number);
}

BigNumber.prototype.add = function(number2) {
  var result = [];
  var carry = 0;
  for (var i = 0; i < this.num.length || i < number2.num.length; i++) {
    var sum = this.num[i] + (number2.num[i] || 0) + carry;
    result.push(sum % 10);
    carry = sum >= 10 ? 1 : 0;
  }
  if (carry) {
    result.push(carry);
  }
  return new BigNumber(result.reverse().join(''));
}

var a = new BigNumber('12345678901234567890');
var b = new BigNumber('98765432109876543210');
var c = a.add(b);
console.log(c.num); // 输出:[ 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 3, 4, 4 ]

在上述代码中,我们定义了一个BigNumber构造函数,并使用prototype给该函数添加了add方法,实现了两个大数的加法。这是一个不错的应用场景,而且很好地说明了prototype的使用方式。

示例二:使用prototype实现extend方法

在项目中,我们经常需要使用工具类提供的extend方法,它用于合并多个对象并返回合并后的对象。我们可以通过prototype添加extend方法,如下:

Object.prototype.extend = function() {
  var target = this;
  var args = Array.prototype.slice.call(arguments);
  args.forEach(function(source) {
    if (source) {
      Object.keys(source).forEach(function(key) {
        target[key] = source[key];
      });
    }
  });
  return target;
};

var obj1 = {a:1, b:2};
var obj2 = {b:3, c:4};
var obj3 = {d:5};

var result = obj1.extend(obj2, obj3);
console.log(result); // 输出:{ a: 1, b: 3, c: 4, d: 5 }

在上述代码中,我们给Object.prototype添加了一个extend方法,该方法可以合并多个对象,并返回合并后的对象。这样就可以给所有对象都添加一个extend方法,方便地处理对象合并的问题。

本文标题为:JavaScript中的prototype使用说明