原型对象
原型对象(prototype)是构造函数的一个属性,指向另一个对象;原型对象本身就是一个对象,原型对象的所有属性和方法,都被构造函数所拥有
- 构造函数通过原型对象定义的方法是该构造函数的所有对象共享的
- 更倾向于把不变或者常用的方法,直接定义在prototype对象上,这样,构造函数的所有实例对象都可共享这些方法
- 一般情况下,会把公共方法定义到原型对象上 ,可以避免浪费内存
function Person (uname, age) {
this.uname = uname;
this.age = age;
}
// 每个构造函数都有一个属性,prototype,称为原型对象
// console.log( Person.prototype );
Person.prototype.say = function () {
console.log('说话哇哈哈');
}
var obj = new Person('张三丰', 22);
console.log( obj );
// obj.say();
// function Star () {}
// console.log( Star.prototype );
对象原型
简称原型(__proto__)
- 对象都会有一个属性__proto__,它指向构造函数的原型对象(prototype),对象之所有可以使用原型对象上的方法,就是因为对象上有__proto__的存在。
- __proto__原型和prototype原型对象是等价的
- __proto__对象的意义在于为对象的查找机制提供一个方向,但它是一个非标准属性,只可读,不可写,实际开发中并不使用这个属性,它只是内部指向prototype
console.log( obj.__proto__ );
constructor(构造函数)
这里指原型对象和原型中的constructor,原型对象(prototype)和原型(__proto__)里面都有一个constructor属性
- constructor指回构造函数本身
- 主要记录对象引用于哪个构造函数,它可是让原型对象重新指向原来的构造函数
构造函数,原型对象和原型三者之间的关系
原型链
提供一个成员的查找机制,或者查找规则
javascript的成员查找机制
- 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性。
- 如果没有就查找它的原型(也就是__proto__指向的prototype 原型对象)。
- 如果还没有就查找原型对象的原型(Object的原型对象)。
- 依此类推一直找到Object 为止(null)。
- __proto__对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线。
重写prototype
// 构造函数
function Star (uname, age) {
this.uname = uname;
this.age = age;
}
// 方法
// console.log(Star.prototype);
/* Star.prototype.chang = function () {
console.log('唱歌');
}
Star.prototype.tiao = function () {
console.log('跳舞');n
Star.prototype.rap = function () {
console.log('rap');
} */
// 重写prototype,会覆盖constructor,所以重写prototype的同时,也重写constructor
Star.prototype = {
// constructor : Star,
constructor : Star,
chang : function () {},
tiao : function () {},
rao : function () {}
};
console.log(Star.prototype);
拓展内置对象
这里以拓展Array对象为例
Array.prototype.sum = function () {
var sum = 0;
for (var i = 0; i < this.length; i++) {
sum += this[i];
}
return sum;
}
var arr = [1,2,3];
console.log( arr.sum() );
var newArr = [6,7,8,9];
console.log( newArr.sum() );