javascript是一种“基于prototype的面向对象语言“,与java有非常大的区别,无法通过类来创建对象。那么,既然是面象对象的,如何来创建对象呢?
JavaScript中创建对象的方法如下:
一:使用new关键字调用构造器创建对象;
在JavaScript中,所有的函数名可以看成一个类名;
函数名和其参数可以看成一个构造器用于构造对象;
使用构造函数模式创建对象的几点注意事项:
(1):没有明显的创建对象
(2):直接将属性和方法赋给this对象
(3):没有return语句
(4):创建Student实例的时候,必须要使用new操作符;
function Student(name,age){
this.name=name;//this是当前对象的引用;
this.age=age;
}
var s1=new Student();//没有传入参数,函数里面的name,age是undefine
var s2=new Student("wangshicheng",20);
document.write(s1.name+s1.age);//都是undefine;
document.write(s2.name+s2.age);//都是传入实参的值;
二:使用Object直接创建对象
var myObj=new Object();//使用Object类创建一个空的对象
myObj.name="wangshihcheng";
myObj.age=20;
myObj.infor=function(){
document.write("名字:"+this.name);//this.的指向问题
document.write("年龄:"+this.age);
}
myObj.infor();//调用创建的对象里面的方法;
三:使用JSON创建对象的语法
//object={属性名1:属性值1,属性名2:属性值2,.....}
//注意JOSN格式中属性名要加双引号;
var p={
"name":"wangsch",
"gender":"man",
"age":40,
"son":[
{
"name":"son1",
"age":2
},
{
"name":"son2",
"age":5
}
],
"infor":function(){
document.write("父亲的姓名:"+this.name+",父亲的年龄:"+this.age+"<br>");
for( var child in this.son ){
document.write("儿子的姓名:"+this.son[child].name+",儿子的年龄:"+this.son[child].age+"<br>");
}
}
}
p.infor();//调用对象p中的infor方法
四:原型模式创建对象
在JavaScript中,每个函数都有一个prototype属性,它是一个指针,指向一个对象,叫做
原型对象,原型对象包含了可以由特定类型的所有实例对象共享的属性和方法;
另外,这个对象有一个自带的属性constructor,指向创建对象的构造方法;
当我们使用原型模式时可以使所有的实例共享原型对象的属性和方法,
从而我们不必要早构造函数中定义对象的实例的信息;
function Student(){
}
Student.prototype.name="wang";
Student.prototype.sex="man";
Student.prototype.;
Student.prototype.sayName=function(){
console.log(this.name);
}
var s1=new Student();
s1.sayName();//wang
var s2=new Student();
s2.sayName();//wang
s2.name="shicheng";
s2.sayName();//shicheng
当我们读取某个对象的属性时,都会执行一次搜索,搜索首先从对象实例本身开始,
如果在实例中找到了这个属性,则搜索结束,返回属性的值;
若实例上没有找到,则继续向对象的原型对象上面延申,搜索对象的原型对象,若在原型上面
找到这个属性,则返回原型上面属性对应的值,若没有找到,则返回undefine;
因此,可以看出,实例对象属性会覆盖原型对象上面的属性;
五:组合使用构造函数和原型模式
构造函数用于定义实例的属性,原型模式则用于定义方法和共享的属性;
function Student(name,sex,grade){
this.name=name;
this.sex=sex;
this.grade=grade;
}
Student.prototype.sayName=function(){
console.log(this.name);
}
Student.prototype.school="nongda";
这种混合模式可以支持想构造函数传入参数,还极大的节约了内存。
ECMA-262把对象定义为:”无需属性的集合,其属性可以包含基本值、对象或者函数。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。正因为这样,我们可以把ECMAScript的对象想象成散列表:无非就是一组名对值,其中值可以是数据或函数。
这篇文章讲解Js数组和对象的一些使用技巧,如何将不同的数组,对象合并/结合为1个的方法
在JavaScript中可以使用 . 或者 [ ] 来访问对象的属性,但是对象中方法只能通过 . 来获取;使用.运算符来存取对象的属性的值。或者使用[]作为一个关联数组来存取对象的属性。但是这两种方式有什么区别了?
对象使用obj.length时,它得到的值是undefined的,所以只能通过for...in循环获取对象的属性,我们发现并没有按属性的顺序显示,而且顺序在各个浏览器下显示也不同。 这是为什么呢?
JS声明对象时属性名加引号与不加引号的问题,一般情况下属性名加引号和不加引号是都可以的,效果是一样的。如果属性名是数字,则必须用“”包围,并且用 [] 方括号访问。
javascript的原生对象:也叫内部对象、本地对象、native object;内置对象:Global(全局对象)、Math ;宿主对象:有宿主提供的对象,在浏览器中window对象以及其下边所有的子对象(如bom、dom等等),在node中是globla及其子对象,也包含自定义的类对象。
判断对象中是否有某属性的常见方式总结,不同的场景要使用不同的方式。一点( . )或者方括号( [ ] )、二in 运算符、三hasOwnProperty()。三种方式各有优缺点,不同的场景使用不同的方式,有时还需要结合使用
error,指程序中的非正常运行状态,在其他编程语言中称为“异常”或“错误”。解释器会为每个错误情形创建并抛出一个Error对象,其中包含错误的描述信息。
由于JavaScript的灵活性,我们可以轻易地重写(override)一些于其他人定义的对象(object)。换句话说,任何人都可以重写我们所定义的对象。这是一个非常强大的特性,许多开发者都有兴趣试试,来拓展或者修改某些对象的行为。
虽然现在已经是ES6的时代,但是,还是有必要了解下ES5是怎么写一个类的。本文详述JavaScript面向对象编程中的类写法,并分步骤讲述如何写出优雅的类。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!