详解原型对象(prototype)
如何理解原型(prototype)
JavaScript 是一种通过原型实现继承的语言,它与别的高级语言是有区别的,例如Java. C#
是通过类型决定继承关系的,JavaScript 是动态的弱类型语言。总之,可以认为JavaScript中所有数据都是对象。在JavaScript中,原型也是一个对象,用原型可以实现对象的属性继承,JavaScript 的对象中都包含了一个"prototype"
内部属性,这个属性所对应的就是该对象的原型。
作为对象的内部属性,"prototype"
是不能直接访问的。所以,为了方便查看对象的原型,Firefox和Chrome内核的JavaScript 引擎中提供了" __proto__"
这 个非标准的访问器(ECMA新标准中引入了标准对象原型访问器"Object.getPrototype(object)"
)。
原型的主要作用就是实现继承与扩展对象。
原型规则和示例
1、所有的引用类型(数组、对象、函数)都具有对象的特征(可以自由扩展属性,null除外),如下所示:
var obj = {};
obj.a = 100;
var arr = [];
arr.a = 100;
function fn(){};
fn.a = 100;
var f1 = new fn();
2、所有的引用类型(数组,对象、函数)都有一个__ptoto__
属性,属性值是一个普通对象。如下所示:
var obj = {};
obj.a = 100;
var arr = [];
arr.a = 100;
function fn(){};
fn.a = 100;
var f1 = new fn();
console.log(obj.__proto__);
console.log(arr.__proto__);
console.log(fn.__proto__);
3、所有的函数都有一个prototype
属性,属性值也是一个普通对象。
function fn(){};
fn.a = 100;
var f1 = new fn();
console.log(fn.__proto__);
console.log(fn.prototype);
4、所有的引用类型(数组、对象、函数),__proto__
都指向它的构造函数的prototype
属性值。
var obj = {};
obj.a = 100;
var arr = [];
arr.a = 100;
function fn(){};
fn.a = 100;
var f1 = new fn();
console.log(obj.__proto__);
console.log(arr.__proto__);
console.log(fn.__proto__);
console.log(obj.__proto__===Object.prototype);
console.log(arr.__proto__===Array.prototype);
console.log(f1.__proto__===fn.prototype);
5、当调用一个对象的函数或属性时,如果当前对象里找不到,那么就在原型对象里面逐级寻找。