志在指尖
用双手敲打未来

javascript的对象主要包括(javascript面向对象编程)

javascript的对象主要包括

1、JavaScript内置目标:
指JavaScript语言本身预界说的目标,在ECMAScript规范界说,由一切的浏览器厂家来供给具体完成,因为规范的统一,故这些目标的浏览器兼容性问题不太大
String、Number、Boolean、Array、Date、RegExp、Math、Error、Object、Function、Global
2、JavaScriptWindow-浏览器目标:
浏览器目标模型(BrowserObjectModel(BOM))允许JavaScript与浏览器对话。
不存在浏览器目标模型(BOM)的官方规范。现代的浏览器现已(简直)完成了JavaScript交互相同的方法和特点,因而它经常作为BOM的方法和特点被提到。
因为现代浏览器现已(简直)完成了JavaScript交互性方面的相同方法和特点,因而常被认为是BOM的方法和特点。javascript
Window目标:
一切浏览器都支持window目标。它表明浏览器窗口。
1)、window目标是最顶层的目标;
2)、window目标有6大特点,包括:document、frames、history、location、navigator、screen,这6大特点本身也是目标;
3)、window目标下的document特点也是目标,并且document下也有5大特点(anchors、forms、images、links、location)也是目标。

javascript面向对象编程

在JavaScript的大国际里讨论面向目标,都要说到两点:1.JavaScript是一门依据原型的面向目标言语2.模仿类言语的面向目标办法。关于为什么要模仿类言语的面向目标,我个人认为:某些情况下,原型办法能够提供一定的便当,但在杂乱的运用中,依据原型的面向目标系统在笼统性与承继性方面差强人意。由于JavaScript是仅有一个被各大浏览器支撑的脚本言语,所以各路高手不得不运用各种办法来提高言语的便当性,优化的结果就是其编写的代码越来越像类言语中的面向目标办法,从而也掩盖了JavaScript原型系统的实质。
依据原型的面向目标言语
原型办法如类办法相同,都是是一种编程泛型,即编程的办法论。别的最近大红大紫的函数编程也是一种编程泛型。JavaScript之父BrendanEich在规划JavaScript时,从一开始就没打算为其参加类的概念,而是学习了别的两门依据原型的的言语:Self和Smalltalk。
已然同为面向目标言语,那就得有创立目标的办法。在类言语中,目标依据模板来创立,首要界说一个类作为对实践国际的笼统,然后由类来实例化目标;而在原型言语中,目标以克隆另一个目标的办法创立,被克隆的母体称为原型目标。javascript
克隆的关键在于言语自身是否为咱们提供了原生的克隆办法。在ECMAScript5中,Object.create能够用来克隆目标。
varperson={
name:”tree”,
age:25,
say:function(){console.log(“I’mtree.”)
}
};varcloneTree=Object.create(person);console.log(cloneTree);
原型办法的意图并不在于得到一个一模相同的目标,而提供了一种便捷的办法去创立目标(出自《JavaScript规划办法与开发实践》)。可是由于言语规划的问题,JavaScript的原型存在着诸多矛盾,它的某些杂乱的语法看起来就那些依据类的言语,这些语法问题掩盖了它的原型机制(出自《JavaScript言语精粹》)。如:
functionPerson(name,age){this.name=name;this.age=age;
}varp=newPerson(‘tree’,25)
实践上,当一个函数目标呗创立时,Function结构器产生的函数目标会运转类似这样的一些代码:
this.prototype={constructor:this}
新的函数目标被赋予一个prototype特点,它的值是一个包含constructor特点且特点值为该新函数的目标。当对一个函数运用new运算符时,函数的prototype的特点的值被作为原型目标来克隆出新目标。假如new运算符是一个办法,它的执行过程如下:
Function.prorotype.new=function(){//以prototype特点值作为原型目标来克隆出一个新目标varthat=Object.create(this.prorotype);//改变函数中this关键指向这个新克隆的目标varother=this.apply(that,arguments);//假如返回值不是一个目标,则返回这个新克隆目标return(other&&typeofother===’object’)?other:that;
}
从上面能够看出,虽然运用new运算符调用函数看起来像是运用模板实例化的办法来创立目标,但实质还是以原型目标来克隆出新目标。
由于新克隆的目标能否拜访到原型目标的一切办法和特点,加上new运算符的特性,这便成了使用原型模仿类式言语的柱石。
使用原型模仿类式言语
笼统
用原型办法来模仿类,首要是笼统办法。依据JavaScript言语的特点,通常一个类(实践上是伪类)通常是将字段放置于结构函数(实践上是new运算符调用的函数,JavaScript自身并没有结构函数的概念)中,而将办法放置于函数的prototype特点里。
functionPerson(name,age){this.name=name;this.age=age;
};
Person.prototype.say=function(){console.log(“Hello,I’m”+this.name);
};
承继
承继是OO言语中的一个最为人津津有味的概念。许多OO言语都支撑两种承继办法:接口承继和完成承继。接口承继之承继办法签名,而完成承继则承继实践的办法。可是ECMAScript中无法完成接口承继,只支撑完成承继,而且其完成承继主要是依托原型链来完成的。(出自《JavaScript高级程序规划》6.3节——承继)在高三中作者探究了各种关于承继的模仿,如:组合承继、原型承继、寄生承继、寄生组合承继,终究寄生组合式成为一切模仿类式承继的根底。
functionPerson(name,age){this.name=name;this.age=age;
};
Person.prototype.say=function(){console.log(“Hello,I’m”+this.name);
};functionEmployee(name,age,major){
Person.apply(this,arguments);this.major=major;
};
Employee.prototype=Object.create(Person.prototype);
Employee.prorotype.constructor=Employee;
Employee.prorotype.sayMajor=function(){console.log(this.major);
}
高三中只给出了单承继的解决方案,关于多承继的模仿咱们还得自己想办法。由于多承继有其自身的困难:面向目标言语假如支撑了多承继的话,都会遇到闻名的菱形问题(DiamondProblem)。假定存在一个如左图所示的承继联系,O中有一个办法foo,被A类和B类覆写,可是没有被C类覆写。那么C在调用foo办法的时分,究竟是调用A中的foo,还是调用B中的foo?
检查图片
所以大多数言语并不支撑多承继,如Java支撑单承继+接口的办法。JavaScript并不支撑接口,要在一个不支撑接口的言语上去模仿接口怎么办?答案是闻名的鸭式辨型。放到实践代码中就是混入(mixin)。原理很简单:
functionmixin(t,s){for(varpins){
t[p]=s[p];
}
}
值得一提的是dojo使用MRO(办法解析顺序(MethodResolutionOrder),即查找被调用的办法地点类时的查找顺序)办法解决了多承继的问题。
到此,咱们现已清楚了模仿类言语的基本原理。作为一个爱折腾的程序员,我期望拥有自己的办法来简化类的创立:
提供一种便当的办法去创立类,而不暴露函数的prototype特点在子类中掩盖父类办法时,能够像Java相同提供super函数,来直接拜访父类同名办法以更便利的办法增加静态变量和办法而不去关心prototype像C#那样支撑Attribute
终究,在学习各位大牛的常识总结,我编写了自己的类创立工具O.js:
(function(global){
vardefine=global.define;if(define&&define.amd){
define([],function(){returnO;
});
}else{
global.O=O;
}
functionO(){};
O.derive=function(sub){debugger;
varparent=this;sub=sub?sub:{};
varo=create(parent);
varctor=sub.constructor||function(){};//如何调用父类的结构函数?
varstatics=sub.statics||{};
varms=sub.mixins||[];varattrs=sub.attributes||{};deletesub.constructor;deletesub.mixins;deletesub.statics;deletesub.attributes;//处理承继联系
ctor.prototype=o;
ctor.prototype.constructor=ctor;
ctor.superClass=parent;//使用DefineProperties办法处理Attributes
//for(varpinattrs){
Object.defineProperties(ctor.prototype,attrs);//}
//静态特点
mixin(ctor,statics);//混入其他特点和办法,注意这儿的特点是一切实例目标都能够拜访而且修改的
mixin(ctor.prototype,sub);//以mixin的办法模仿多承继for(vari=0,len=ms.length;i<len;i++){
mixin(ctor.prototype,ms[i]||{});
}
ctor.derive=parent.derive;//_super函数
ctor.prototype._super=function(f){
debugger;returnparent.prototype[f].apply(this,Array.prototype.slice.call(arguments,1));
}returnctor;
}
functioncreate(clazz){
varF=function(){};
F.prototype=clazz.prototype;//F.prototype.constructor=F;//不需要returnnewF();
};
functionmixin(t,s){for(varpins){
t[p]=s[p];
}
}
})(window);
类创立办法如下:
varPerson=O.derive({
constructor:function(name){//结构函数this.setInfo(name);
},
statics:{//静态变量declaredClass:”Person”},
attributes:{//模仿C#中的特点Name:{
set:function(n){this.name=n;console.log(this.name);
},
get:function(){returnthis.name+”Attribute”;
}
}
},
share:”asdsaf”,//变量坐落原型目标上,对一切目标共享setInfo:function(name){//办法this.name=name;
}
});varp=newPerson(‘lzz’);console.log(p.Name);//lzzAttributeconsole.log(Person);
承继:
varEmployee=Person.derive({//子类有父类派生constructor:function(name,age){this.setInfo(name,age);
},
statics:{
declaredClass:”Employee”},
setInfo:function(name,age){this._super(‘setInfo’,name);//调用父类同名办法this.age=age;
}
});vare=newEmployee(‘lll’,25);console.log(e.Name);//lllAttributeconsole.log(Employee);
以上就是本文的全部内容,期望对咱们的学习有所帮助。
JavaScript中获取纯粹的undefined的办法
1、为什么要获取undefined由于undefined在javascript中不是保留字,能够被用户作为变量来赋值,这样假如咱们后期需要用到undefined来检测一个变量的话,那么
JavaScript中三种异步上传文件办法
异步上传文件是为了更好的用户体会,是每个前端有必要掌握的技能。这儿我提出三点有关异步文件上传的办法。运用第三方控件,如Flash,ActiveX等浏览器

未经允许不得转载:IT技术网站 » javascript的对象主要包括(javascript面向对象编程)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载