学过java,c#,vb的都知道类的概念,而类具有继承、封装、多态等功能。而javascript它不是面向对象语言,它是解释性语言。
但我们同样可以使用javascript来实现继承、多态。
javascript实现类,有多种方法。
方法一:构造方法。
代码
function coder(){
this.name = '小王';
this.job = '程序员';
this.coding = function ()
{
alert('我正在写代码');
}
}
var coder=new coder();
alert(coder.name);
coder.coding();
方法二:工厂方法。
代码
function createCoderFactory(){
var obj=new Object();
obj.name = '小王';
obj.job = '程序员';
obj.coding = function (){
alert('我正在写代码');
};
return obj;
}
var coder = createCoderFactory();
alert(coder.name);
coder.coding();
但工厂方法和构造方法都有着一个相同的缺点,就是每创建一个实例,都会实例化该类的每个函数。
方法三:原形链。
代码
function coder(){}
coder.prototype.name = '小王';
coder.prototype.job = '程序员';
coder.prototype.coding = function(){
alert('我正在写代码');
};
var coder = new coder();
alert(coder.name);
coder.coding();
注意:书上说:原型链有个缺点就是它所有属性都共享,只要一个实例改变其他的都会跟着改变。 测试如下:
var coder1 = new coder();
var coder2 = new coder();
alert(coder1.name); /*显示“小王”*/
coder2.name = '老王';
alert(coder1.name); /*这个显示“小王” 如果按书上说的应该是显示"老王"*/
alert(coder2.name); /*这个显示“老王”*/
alert(coder1.name);如果按书上说的应该是显示"老王",但这里显示的是“小王”,所以书上出错了。
方法四:混合方式。
以上三种都有着各自的缺点,所以我们要加以改进。
function coder(){
this.name = '小王';
this.job = '程序员';
}
coder.prototype.coding = function(){
alert('我正在写代码');
};
方法五:动态原链。
要解决前三种的缺点,还有一种方法。
代码
function coder(){
this.name = '小王';
this.job = '程序员';
if (typeof(coder._init) == 'undefined'){
this.coding = function ()
{
alert('我正在写代码');
};
this._init = true;
}
}
这个方法呢,当第一次使用时,由于_init没初始化,就会执行以下的代码,实例化coding函数。以后就不会再执行,这样就只实例化函数一次。
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn