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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。