java中什么是原型?java 有原型链吗
很多朋友对于java中什么是原型和java 有原型链吗不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
java 有原型链吗
1.原型链
原型链是JavaScript中继承的主要方法。
每个构造函数都拥有一个原型对象,原型对象都包含一个指向构造函数的指针(constructor),实例都包含一个指向原型对象的内部指针(__proto__)。
假如,原型对象(Son.prototype)等于另一个类型(Pserson)的实例(person1),那么此时的原型对象(Son.prototype)将包含一个指向另一个原型(Person.prototype)的指针,相应的,另有一个原型(Person.prototype)中也包含着一个指向另一个构造函数(Person())的指针。
再如,另一个原型(Person.prototype)又是另一个类型(Person)的实例(person1),那么上述关系依旧成立,如此层层递进,就构成了实例与原型的链条,这就是所谓的原型链。
functionSuperType(){this.property=true;}SuperType.prototype.getSuperValue=function(){returnthis.property;}functionSubType(){this.subproperty=false;}//继承了SuperTypeSubType.prototype=newSuperType();SubType.prototype.getSubValue=function(){returnthis.subproperty;}varinstance=newSon();alert(instance.getSuperValue());//truealert(instanceinstanceofObject);//truealert(instanceinstanceofSuperType);//truealert(instanceinstanceofSubType);//true
以上代码定义了两个类型:SuperType和SubType。每个类型分别有一个属性和方法。它们主要区别就是SubType继承了SuperType,而这继承是通过创建SuperType新实例,并将这个新实例赋给SubType.prototype实现的。实现的本质就是重写原型对象,代之以新类型的实例。
instance指向Subtyoe.prototype,SubType.prototype又指向了SuperType.prototype。getSuperValue()方法仍然还在SuperType。prototype中,但property则位于SubType.prototype中。这是因为property是一个实例属性,而getSyoerValue()则是一个原型方法。既然SubType.prototype现在是SuperType的实例,那么property当然位于该实例中。此外,要注意instance.constrcutor现在指向的是SuperType,这是因为原来SubType.propertype中的constructor被重写了的缘故。
注:SubType.propertype中的constructor不被重写了的缘故,而是SubType的原型指向了另一个对象——SuperType的原型,而这个原型对象的constructor是指向SuperType的。
通过实现原型链,本质上就是扩展了原型搜索机制。
2.别忘了默认的原型
事实上,我们的原型链还少了一环,所有引用类型默认继承了Object类型,而这个继承也是通过原型链实现的。我们要记住,所有函数的默认原型都是Object的实例,因此默认原型都会包含一个内部指针,指向Object.prototype。这也正式自定义类型能使用toString()等默认方法的原因。
一句话,SubType集成了SuperType,而SuperType继承了Object。当调用instance.toSring()时,实际调用的是保存在Object.prototype中的那个方法。
3.确定原型和实例的关系
可以使用instanceof操作符来测试实例与原型链中出点过的构造函数。
alert(instanceinstanceofObject);//truealert(instanceinstanceofSuperType);//truealert(instanceinstanceofSubType);//true
4.谨慎的定义方法
子类型有时需要重写父类型中的某个方法,或者需要添加父类型中不穿在的某个方法,但不管怎么,给原型添加的代码一定要放在替换原型的语句之后。
functionSuperType(){this.property=true;}SuperType.prototype.getSuperValue=function(){returnthis.property;}functionSubType(){this.subproperty=false;}//继承了SuperTypeSubType.prototype=newSuperType();//添加新方法SubType.prototype.getSubValue=function(){returnthis.subproperty;}//重写父类型中的方法SubType.prototype.getSuperValue=function(){returnthis.subproperty;}varinstance=newSubType();alert(instance.getSuperValue());//false
注意,在通过原型链实现继承时,不能使用对象字面量创建原型对象,这样会重写原型链。
functionSuperType(){this.property=true;}SuperType.prototype.getSuperValue=function(){returnthis.property;}functionSubType(){this.subproperty=false;}//继承了SuperTypeSubType.prototype=newSuperType();//使用字面量添加新方法,会导致上一行代码无效SubType.prototype={getSubValue:function(){returnthis.subproperty;},someOtherMethod:function(){returnfalse;}}varinstance=newSubType();alert(instance.getSuperValue());//error
由于现在的原型包含的是一个Object的实例,而非SuperType的实例,因此我们设想中的原型链已经别切断——SubType和SuperType已经没关系了。
5.原型链的问题
原型链最主要的问题还是来支援引用类型的原型,我们以前说过包含引用类型值的原型属性会被所有实例共享,这也是为什么要在构造函数中定义属性,而不是在原型中定义属性的原因了。在通过原型来实现继承时,原型实际上会被变成另一个类型的实例。
functionSuperType(){this.colors=["red","blue","green"];}functionSubType(){}//继承了SuperTypeSubType.prototype=newSuperType();varinstance=newSubType();instance.colors.push("black");//"red","blue","green","black"alert(instance.colors);varinstance2=newSubType();alert(instance2.colors);//"red","blue","green","black"
原型的第二个问题:在创建子类的实例时,不能向父类型的构造函数传递参数,所以实践中很少单独用到原型链。
java 中|| 和 && 这类的符号都表示什么
&&和||是一种逻辑运算符,&&是逻辑与,当两个数都为真,则结果为真。||是逻辑或,两个数任意一个为真,则结果为真。
举个例子:
1、a&& b
当a、b都为真时,结果为真。有一个为假或者都为假时结果为假。
2、a|| b
当a、b有一个为真时,结果为真。a、b都为假时结果为假。
扩展资料:
在java中还有其他的逻辑符号,比如:!、|、&
“!”是非运算符号,比如a为真,则!a则为假。a如果为假,则!a为真。
而“|”也是逻辑或,“&”也是逻辑与,但是他们与“||”和“&&”有些区别,区别如下:
“&”与“|”无论第一个判断条件是否成立,逻辑运算符前后两个条件都会进行判断。
“&&”与“||”,前者第一个条件不成立,后面的条件均不进行判断,返回false;后者第一个条件成立,后面的条件均不进行判断,返回true。
java中抽象工厂模式和原型模式之间的区别
工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。在以后扩展产品的时候方便很多,只需要添加一个工厂类,一个产品类,就能方便的添加产品,而不需要修改原有的代码。而在简单工厂中,如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case分支,工厂模式符合软件开发中的OCP原则(open close principle),对扩展开放,对修改关闭。
抽象工厂模式:这个模式我总是感觉和builder模式非常相似。
工厂方法模式提供的是对一个产品的等级模式,,而抽象工厂方法提供的是对多个产品的等级模式,注意,这里的多个具体产品之间是相互耦合的,也就是说这里的抽象工厂提供的产品之间是存在某种联系的。
有人做如下的比较:
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
关于java中什么是原型,java 有原型链吗的介绍到此结束,希望对大家有所帮助。