Javascript也是一种面向对象的语言,但它是一种基于原型的语言,而不是基于类的语言。在Javascript中,类和对象没有太大区别。
什么是原型:
函数定义的对象有一个原型属性,原型属性指向一个原型对象。注意原型属性和原型对象是两个不同的东西,所以要注意区别。原型对象中还有另一个构造器属性,它也指向一个构造器对象,而这个构造器对象只是函数本身。是不是很绕弯?用伪代码表示如下:
不懂var函数{ prototype : prototype { constructor : constructor==function } }吗?看图片:
原型的作用:
这个原型到底是做什么的?请看下面的例子:
函数jb51(){ } jb51 . prototype . name=' a ';var测试=新jb51();alert(test . name)//“a”;很奇怪名字属性没有设置为test,但是为什么会有值呢?
这是原型的功劳。新构造函数构造uw3c后,uw3c原型属性中的name对象被继承到对象测试的属性中。然后看:
var name=' js函数jb51(name){ alert(this . name);//' CSS ' } JB 51 . prototype . name=' CSS ';var测试=新jb51();Test()为什么alert的值不是“js”?这个过程大致如下:
var测试={ };uw3c.call(测试);第一步是创建一个新的对象(测试)。
在第二步中,对象(测试)中构建的原型对象被设置为构造器(即UW3C)的原型属性所引用的原型对象。
第三步是以对象(test)为这个参数调用构造函数(即uw3c),完成成员设置等初始化工作。
第二步,一个新名词是内置原型对象。请注意,这个新名词与原型对象不同。为了区分它,我调用inobj,inobj,它指向函数uw3c的原型对象。uw3c的原型对象中出现的任何属性或函数都可以直接用在测试对象中,这就是JS中的原型继承。
通常,对象是这样创建的:
函数person(name){ this . SayHi=function(){ alert(' hi ' this . name);} this.name=name}var p=新人(' Dan ');p . SayHi();上面,使用new关键字通过一个对象创建一个对象实例(该函数也是一个特殊的对象)。
在基于类的语言中,属性或字段通常是预先在类中定义的,但是在Javascript中,字段可以在对象创建后添加到类中。
功能动物(){ } var cat=new animal();cat.color='绿色';上图中,颜色字段只属于当前的cat实例。对于添加的字段,如果您希望所有动物实例都拥有它们,该怎么办?
-使用原型函数animal(){ } animal . prototype . color=' green ';var cat=新动物();var dog=新动物();console . log(cat . color);//green console . log(dog . color);//绿色不仅可以添加字段,还可以通过Prototype添加方法。
function animal(){ } animal . prototype . color=' green ';var cat=新动物();var dog=新动物();console . log(cat . color);//green console . log(dog . color);//green animal . prototype . run=function(){ console . log(' run ');} dog . run();最初,通过原型属性,对象的行为可以在创建后改变。例如,您可以向特殊对象数组添加一个方法。
array . prototype . remove=function(elem){ var index=this . indexof(elem);if(index=0){this.splice(index,1);}}var arr=[1,2,3];arr . remove(2);除了通过原型定义对象的属性或方法,还可以通过对象的构造函数定义类的属性或方法。
function animal(){ this . color=' green ';this . run=function(){ console . log(' run ');}}var mouse=新动物();mouse . run();以上做法也可以让所有动物实例共享所有领域和方法。另一个优点是类的局部变量可以在构造函数中使用。
函数animal(){ var RuneNough=false;这是绿色的。run=function on(){ if(!runAlreadh){console.log('开始运行');} else {console.log('已在运行')}}}其实,一个更加实际的做法是把通过构造函数结合通过原型定义一个类的字段和行为。
函数animal(){ var RuneNough=false;this.run=function(){if(!奔跑已经){console.log('我正在运行');} else {console.log('我已经在运行');} } }动物。原型。color=动物。原型。hide=function(){控制台。log(');}var马=新动物();马。run();马。hide();原型允许我们在创建对象之后来改变对象或类的行为,并且这些通过原型属性添加的字段或方法所有对象实例是共享的。