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使用说明 - Python技术站