程序猿都没对象,JS竟然有对象?

  现在做项目基本是套用框架,不论是网上的前端还是后端框架,也会寻找一些封装好的插件拿来即用,但还是希望拿来时最好自己过后再回过头了解里面的原理,学习里面优秀的东西,不论代码封装性,还是小到命名。

  好吧,扯远了,在这里要讲的是大家前端用得多的JS,可能接触最多的是Jquery,但原生的JS最好还是要了解的,至少能看懂别人的代码,然后学习。

  平时用得多的无非是if for 逻辑处理字符串,截断字符串,数组,然后是查找元素,对元素背景什么的属性操作,这些都是些实用性上的东西,这里讲一些更深入点的,如何理解Javascript对象。

  C#,Java都是面象对象的语言,但JavaScript本身不是面向对象的语言,而是基于对象的语言。 JavaScript中所有事物都是对象, 包括字符串、数组、日期、数字,甚至是函数(验证方法是你可以在实例上 . 出属性)。

  基于这点我们可以封装自己的插件,这里就不讲怎么制作插件了,想了解的可查询我的如何制作插件的文章。

创建对象,平时用到的方法:

var emptyObject1 = {};           //创建空对象
var emptyObject2 = new Object(); //创建空对象
var person = {"name":"sdcyst",
          "age":18,
          "sex":"male"};     //创建一个包含初始值的对象person
alert(person.name);              //sdcyst
alert(person["age"]);            //18

  注意上面如何访问一个对象的属性,通过"."操作符获取对象的属性,必须得知道属性的名字.一般来说"[]"操作符获取对象属性的功能更强大一些,
  可以在[]中放入一些表达式来取属性的值,比较有灵活性,如 name["name"+(i+1)];

  delete操作符可以删除对象中的某个属性,判断某个属性是否存在可以使用"in"操作符,需要注意的是对象中的属性是没有顺序的。

var name = {"name1":"NAME1","name2":"NAME2","name3":"NAME3","name4":"NAME4"};
var namestring = "";
for(var props in name) {  //循环name对象中的属性名字
    namestring += name[props];
}
alert(namestring);  //NAME1NAME2NAME3NAME4
 
delete name.name1;  //删除name1属性
delete name["name3"];  //删除name3属性
namestring = "";
for(var props in name) {  //循环name对象中的属性名字
    namestring += name[props];
}
alert(namestring);  //NAME2NAME4
 
alert("name1" in name); //false
alert("name4" in name); //true

  

  接下来讲讲比较常见的数组对象是无序数据的集合,而数组则是有序数据的集合,数组中的数据(元素)通过索引(从0开始)来访问,数组中的数据可以是任何的数据类型,数组本身仍旧是对象,创建数组可以用"[]"操作符,或者是用Array()构造函数来new一个。

var array1 = [];  //创建空数组
var array2 = new Array();  //创建空数组
array1 = [1,"s",[3,4],{"name1":"NAME1"}]; //
alert(array1[2][1]);  //4   访问数组中的数组元素
alert(array1[3].name1); //NAME1 访问数组中的对象
alert(array1[8]);   //undefined
array2 = [,,];  //没有数值填入只有逗号,则对应索引处的元素为undefined
alert(array2.length); //3
alert(array2[1]);     //undefined

  需要注意的是var array = new Array(10);初始化的长度10实际上对数组没有任何的约束力,数组的长度是可以任意改变的。

  delete操作符删除数组的元素,注意这个删除仅仅是将数组在该位置的元素设为undefined数组的长度并没有改变

var array = new Array("n1","n2","n3","n4","n5");  //五个元素的数组
var astring = "";
for(var i=0; i<array.length; i++) {           //循环数组元素
    astring += array[i];
}
alert(astring);       //n1n2n3n4n5
delete array[3];                   //删除数组元素的值
alert(array.length + "_" + array[3])  //5_undefined
 
array.length = 3;    //缩减数组的长度
alert(array[3]);     //undefined
array.length = 8;    //扩充数组的长度
alert(array[4]);     //undefined

 

对象中也离不开函数,那如何创建函数:
  function f(x) {........}
  var f = function(x) {......}
上面这两种形式都可以创建名为f()的函数,不过后一种形式可以创建匿名函数。

  方法的调用需要对象的支持,那么在方法中如何获取对象的属性呢?this!this关键字我们已经很熟悉了,在javascript的方法中,我们可以用this来取得对方法调用者(对象)的引用,从而获取方法调用者的各种属性。

var obj = {"name":"NAME","sex":"female"};
obj.print = function() {  //为对象添加方法
    alert(this.name + "_" + this["sex"]);
};
obj.print();  //NAME_female
obj.sex = "male";
obj.print();  //NAME_male

 

来一个更加面向对象的例子。

var person = {name:"defaultname",
              setName:function(s){
              this.name = s;
          },
          "printName":function(){
              alert(this.name);
          }}
person.printName();       //defaultname
person.setName("newName");
person.printName();       //newName

 

  下面更深入点,每一个函数都包含了一个原型(prototype),我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝。

通过prototype创建自定义对象的一个例子:

// 构造函数
        function Person(name, sex) {
            this.name = name;
            this.sex = sex;
        }
        // 定义Person的原型,原型中的属性可以被自定义对象引用
        Person.prototype = {
            getName: function() {
                return this.name;
            },
            getSex: function() {
                return this.sex;
            }
        }

创建自定义对象(实例化类)

var zhang = new Person("ZhangSan", "man");
console.log(zhang.getName());   // "ZhangSan"

当代码var zhang = new Person("ZhangSan", "man")执行时,其实内部做了如下几件事情:

    1. 创建一个空白对象(new Object())。
    2. 拷贝Person.prototype中的属性(键值对)到这个空对象中(我们前面提到,内部实现时不是拷贝而是一个隐藏的链接)。
    3. 将这个对象通过this关键字传递到构造函数中并执行构造函数
    4. 将这个对象赋值给变量zhang。

  上面我们提到了用new来创建一个对象的过程,事实上在这个过程中,当创建了空对象后,new会接着操作刚生成的这个对象的prototype属性。
  每个方法都有一个prototype属性(因为方法本身也是对象),new操作符生成的新对象的prototype属性值和构造方法的prototype属性值是一致的。构造方
法的prototype属性指向了一个prototype对象,这个prototype对象初始只有一个属性constructor,而这个constructor属性又指向了prototype属性所在的方
法。有点晕,看下面的图:

  这样,当用构造函数创建一个新的对象时,它会获取构造函数的prototype属性所指向的prototype对象的所有属性。对构造函数对应的prototype对象所做的任何操作都会反应到它所生成的对象身上,所有的这些对象共享构造函数对应的prototype对象的属性(包括方法)。
看个具体的例子吧:

function Person(name,sex) {  //构造函数
    this.name = name;
    this.sex = sex;
}
Person.prototype.age = 12;   //为prototype属性对应的prototype对象的属性赋值
Person.prototype.print = function() { //添加方法
    alert(this.name+"_"+this.sex+"_"+this.age);
};
 
var p1 = new Person("name1","male");
var p2 = new Person("name2","male");
p1.print();  //name1_male_12
p2.print();  //name2_male_12
 
Person.prototype.age = 18;  //改变prototype对象的属性值,注意是操作构造函数的prototype属性
p1.print();  //name1_male_18
p2.print();  //name2_male_18

  在javascript中,所有的方法都有一个call方法和apply方法。这两个方法可以模拟对象调用方法,它的第一个参数是对象,后面的参数表示对象调用这个方法时的参数。概念比较拗口,平时很少遇到,所以用得少,比较难得理解这里就不作过多的讲解了,请自行查找说得更明了的文章来了解吧。

  以上示例部分整理于园友文章,用得比较明了所以拿来讲解,以上知识点可能只有在大家实际项目中运用的时候发现问题了,然后再来看,这时理解会更深入点,收藏起来作个备忘吧,有些源码等知识可进入园友公众号【一个码农的日常】自行查看。

  再来一次前后照应,连JS都有对象,你为什么没有?!!!(说好的不要打脸……)

 

时间: 2024-10-13 05:36:52

程序猿都没对象,JS竟然有对象?的相关文章

【第二届PHP全球开发者大会】MySQL中文网站创始人叶金荣:程序猿都该知道的MySQL秘籍

5月14-15日的第二届2016PHP全球开发者大会在北京国际会议中心举行.MySQL中文网站创始人.Oracle MySQL ACE叶金荣带来的分享是<程序猿都该知道的MySQL秘籍>,他主要介绍了MySQL的优化秘籍,并对InnoDB引擎做了深入的讲解:同时与大家分享了在MySQL的优化过程中所采的"坑":分享最后,向大家展示了5.7版本中重大变化. 演讲内容结构: MySQL优化秘籍 InnoDB的正确玩法 一些优化参考 硬件.系统.配置选项优化 MySQL参数优化

线性表-c语言程序编译都没问题,运行就崩溃,求解!!!

问题描述 c语言程序编译都没问题,运行就崩溃,求解!!! #include #include #define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define OVERFLOW -1#define OK 1#define ERROR 0typedef int ElemType;typedef struct{ ElemType *elem;//存储空间基址 int length;//当前长度 int listsize;//当前分配的存储容量}SqL

推荐一本PHP程序猿都应该拜读的书_php实例

PHP这几年口碑很差.关于它的"糟糕设计的汇总"和语法上的矛盾有着大量的讨论,但是主要的抱怨通常是安全.很多PHP站点分分钟被黑掉,甚至一些有经验的.有见识的程序员会说,这门语言本身是不安全的. 我总是对此持反对意见,因为有常识性的原因,有如此多的PHP安全违反现象. PHP应用程序经常被黑掉是由于: PHP应用程序太多了. 它易于学习和编写. 糟糕的PHP也容易编写. 就是这么简单.PHP流行好多年了.PHP越是受欢迎,它被发现的漏洞就越多.这些黑客发现的漏洞很少是PHP处理引擎本身

程序猿媳妇儿注意事项

作者: Arale  来源: 简书  发布时间: 2016-08-11 15:42  阅读: 121974 次  推荐: 705   原文链接   [收藏]   十一年前我和程序猿第一次见面,还是大一军训期间.我甚至不确定程序猿是否记得那是第一次见面.当时不小心装伪文艺参加了吉他社,想借一本吉他入门书,然后同在吉他社热心的海哥说他一同学有,就带着我去拿书了.于是我们第一次"见面"了,我只看见一个对着电脑,佝偻着背的背影......严重怀疑程序猿根本没抬头看一眼那个已经晒得像反转熊猫一样

作为程序猿/媛的你在5.20这一天都干了什么???

今天是2017.5.20,也许你忙的都忘记了今天是网络情人节,因为5.20谐音我爱你,被称为网络情人节,也许身为菜鸟程序猿的你会写个小程序或者copy一个网页发给自己的女票或者媳妇或者.......我相信大多数工作的程序猿都不会再搞这种看似很幼稚的东西,因为很low,就算给女票看了,如果不是那种网页版的,女票也许看不懂,还不如给女票或者媳妇发个大红包或者去海吃一顿或者去大商城狂购一番更让女票高兴和k开心吧,之前我也给自己女票发过网页版的心啊,动态图片啥的,当然修改一下文字和背景音乐或者照片就行了

程序猿最喜欢说的30句话:不可能哇,怎么可能出现这个Bug?!

简评:虽然代码总会有这个那个问题,但程序猿却总有谜一般的从容和自信,不管团队其他同学怎么说,也不管测试怎么反馈,在面对Bug的第一瞬间,程序猿都不会怀疑是自己的问题,"是不是电脑问题呀"."是不是环境没配好呀","是不是你修改我代码了",总之这些Bug都与本宝宝无关哇!本文就为大家整理程序猿最还说的30句话. 来看看程序猿经常说的话: 1.在我的电脑上是正常的啊... 2.不可能出现这种情况的 3.快了,已经完成了90%. 4.技术上实现不了 5

90后菜鸟程序猿1年来内心独白(无助,迷茫)

问题描述 本人第一次发帖子,可能废话有点多,望大家海涵,-------------------------我,一个91年的小伙子.大学时期去了部队从军,两年后退役回来做了一个小小的程序猿.没入行之前,身边的人都和我说这一行太枯燥,而且太消耗身体资源.我不以为然,觉得我能耐得住这么枯燥,也能扛得起这份消耗.现在觉得自己以前越发可笑.当然,我并不是讨厌这职业,相反我觉得自己还是很感兴趣的.只是到了现在更多的是无助和迷茫--13年退伍回来,老爸一心想让我进入政府部门,疏通了关系,就等我点头.可是我却觉

程序猿离装逼有多远?

1. 着装 一个牛X的程序猿其实是根本没有时间去打理自己外貌的,所以,发型就要像爱因斯坦那样,头顶一脑袋鸡窝,充满了凌乱蓬松美,而且要让人觉得随时能从头发里掏出一个鸡蛋的感觉.还有必须胡子一大把,这样彰显了自信和从容,如果是不近视则以,一旦近视,就要戴上酒瓶底子那么厚的大眼镜,给人感觉一种科研工作者的风格.而牛X程序猿对自己着装也是有高要求的,不管是春夏秋冬,还是白天晚上,刮风下雨,一个牛X的程序猿都必须十分在意自己着装,T恤+大花裤衩子+拖鞋那是标配,一年365天都是风雨无阻.而换衣服则要保持

惊!十二星座程序猿竟然这样写代码

水瓶座 大概只有水瓶座的程序猿可以做到代码神秘到无人能解. 水瓶座,属于风系星座.常被称为"天才星座"或"未来星座".他们较着重于精神层次的提升,是很好的启发对象.对于编程,也是如此.水瓶座程序猿的代码中充满了各种天马行空的奇思妙想,同样也含纳着一般人没法理解的抽象. 双鱼座 如果说水瓶座程序猿写的代码是来自外太空的探险童话,那双鱼座程序员的代码就是浪漫的诗歌,字里行间都是普希金和海子的诗句.众所周知,双鱼座是极其细腻感性化的一个星座,哪怕是编程这种极富逻辑的东西,