首页 > 代码库 > 【Javascript 拾遗之二】prototype 原型
【Javascript 拾遗之二】prototype 原型
prototype 原型
1、定义
Javascript中有两种容易混淆的类型, function 和 object, 有很多朋友认为他们是一种类型,或是无法分清。我们先来看一下什么时候是function什么时候是object。
var fun1 = function(){ alert(‘prototype‘);}alert(typeof fun1); // functionvar fun1O = new fun1(); // prototypealert(typeof fun1O); // object
一个函数声明好之后他只是在静态内存中,它的类型是function的,使用new 关键字后,function就转换成了object类型,只有对象可以调用其中的方法和属性。
接下来我们来看一下prototype的定义和用法:
prototype是一个原型对象,什么叫“原型对象”呢?其实就是当这个方法传变成对象时,原型对象就会初始化(并且这个对象中的属性和方法都被激活,直接可被对象调用)相当于protoype对象写在一个类的构造函数里,实例化这个类时,构造函数里的对象就被初始化了。虽然javascript没有类的概念,但是你可以把函数看成是一个简单的类来理解。看以下例子:
function People(name){ // People.prototype.name = ‘xxx‘ console.warn(People.prototype);}console.warn(People);console.warn(People.prototype);People.prototype = { name : ‘aaa‘, method : function(){ return ("My name is aaa!"); }}var o = new People();console.warn(o.name);console.warn(o.method());//People(name) 是一个简单的函数//People {} 通过New关键字后,是一个对象//Object { name="aaa", method=function()} 原型对象//aaa 调用对象属性//My name is aaa! 调用对象方法
对象内部prototype的结构是这样的:注意它的Dom结构。
window.People.constructor.prototype = {
name : ‘aaa‘,
method : function(){
...
}
}
2、应用
-原型函数扩展
通常我们想扩展一个Javascript标准对象的方法可以用这样的方法:(ex.给数组添加一个in_array()的方法,判断某个值是否在这个数组中)
这样的调用Array.prototype.in_array,我们发现Array也是一个函数,或者你可以把它看成一个‘类’,我们通过prototype这个属性添加了它的一个源生方法。
如果修改Array.prototype.push,那么将会修改Array默认的push方法,这样做是不建议的。
Array.prototype.in_array = function(e) { for (var i = 0, l = this.length; i < l && this[i] != e; i++) ; return !(i == this.length);}
console.warn([1,2,3,4,5],in_array(3));
//true
-继承
一个简单的A集成B的例子。这种继承方法比较old style了,现在流行的框架中一般都使用对象字面量的属性复制和拷贝,很少用这种方式,因为这种方式效率比较低。在此只做了解和学习。
var A = function(){}var B = function(){ return { name : ‘b‘, method : function(){ alert(‘I\‘m b‘); } }}A.prototype = new B();var a = new A();alert(a.name);a.method();
3、总结
本文简单地介绍了prototype属性的定义和用法,其实也不用把它想得非常深奥和复杂,想想JAVA或是C++中的构造函数,就很容易明白它的用途了,说明白点prototype就是为Javascript类函数提供了一个修改属性和方法的接口,在实例化时,这些定义的属性和方法会赋予实例化后对象,以供对象调用。
【Javascript 拾遗之二】prototype 原型