,,Javascript中的Prototype到底是什么

,,Javascript中的Prototype到底是什么

Javascript也是面向对象的语言,但它是基于原型的语言,而不是基于类的语言。接下来,通过这篇文章,我将向大家介绍Javascript中Prototype的相关知识。感兴趣的朋友可以参考一下。

Javascript也是面向对象的语言,但它是基于原型的语言,而不是基于类的语言。在Javascript中,类和对象似乎没有太大的区别。

什么是prototype:

function定义的对象有一个prototype属性,该属性又指向一个prototype对象。注意,原型属性和原型对象是两回事,要注意区别。在prototype对象中,还有另一个constructor属性,它也指向一个constructor对象,这个对象正是function函数本身。是不是很绕?用伪代码表示如下:

var函数{

原型:原型{

构造函数:构造函数==函数

}

}

还不明白?看图:

prototype的作用:

这个原型到底是做什么的?请看下面的例子:

函数jb51(){

}

jb51 . prototype . name=' a ';

var test=new jb51();

alert(test . name)//' a ';

奇怪,明明name属性不是为test设置的,为什么会有值呢?

这是原型的功劳。uw3c的prototype属性中的name对象在uw3c被新的构造函数构造后被继承到object test的属性中。然后看:

var name=' js

功能jb51(名称){

alert(this . name);//'css '

}

jb51 . prototype . name=' CSS ';

var test=new jb51();

测试()

为什么alert的值不是“js”?这个过程大致如下:

var测试={ };

uw3c.call(测试);

第一步是创建一个新的对象(test)。

第二步,将这个对象(test)内置的prototype对象设置为构造函数(UW3C)的prototype属性引用的prototype对象。

第三步,以对象(test)为参数调用构造函数(uw3c),完成成员设置等初始化。

第二步,一个新的术语是内置的原型对象。请注意,这个新术语与原型对象不同。为了区分,我称之为inobj,inobj指向函数uw3c的原型对象。任何出现在uw3c原型对象中的属性或函数都可以直接用在测试对象中。这是JS中的原型继承。

通常,对象是这样创建的:

功能人(姓名){

this.sayHi=function(){

alert(' hi ' this . name);

}

this.name=name

}

var p=新人('丹');

p . say hi();

以上,使用new关键字通过对象(函数也是特殊对象)创建对象实例。

在基于类的语言中,属性或字段通常是预先在类中定义的,但在Javascript中,可以在对象创建后将字段添加到类中。

功能动物(){}

var cat=新动物();

cat.color=' green

上面,颜色字段只属于当前的cat实例。

对于添加的字段,如果您希望animal的所有实例都有它们,该怎么办?

-使用原型

功能动物(){}

animal . prototype . color=' green ';

var cat=新动物();

var dog=新动物();

console . log(cat . color);//绿色

console . log(dog . color);//绿色

Prototype不仅允许您添加字段,还允许您添加方法。

功能动物(){}

animal . prototype . color=' green ';

var cat=新动物();

var dog=新动物();

console . log(cat . color);//绿色

console . log(dog . color);//绿色

animal . prototype . run=function(){

console.log(“运行”);

}

dog . run();

原来,prototype属性也可以在对象创建后改变它的行为。

例如,您可以向特殊对象数组添加一个方法。

array . prototype . remove=function(elem){

var index=this . index of(elem);

if(index=0){

this.splice(索引,1);

}

}

var arr=[1,2,3];

arr . remove(2);

除了通过prototype定义对象的属性或方法,还可以通过对象的构造函数定义类的属性或方法。

功能动物(){

this.color=' green

this.run=function(){

console.log(“运行”);

}

}

var mouse=新动物();

mouse . run();

上述方法还可以使所有动物实例共享所有字段和方法。另一个好处是你可以在构造函数中使用类的局部变量。

功能动物(){

var runAlready=false

this.color=' green

this . run=function(){

如果(!runAlreadh){

console.log('开始运行');

}否则{

console.log('已运行')

}

}

}

实际上,更实际的方法是通过结合构造函数和原型来定义类的字段和行为。

功能动物(){

var runAlready=false

this.run=function(){

如果(!runAlready){

console.log('我在跑');

}否则{

console.log('我已经在运行');

}

}

}

animal . prototype . color=“”;

animal . prototype . hide=function(){

console . log(“”);

}

var horse=新动物();

horse . run();

horse . hide();

Prototype允许我们在对象或类被创建后改变它的行为,这些通过prototype属性添加的字段或方法被所有对象实例共享。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: