经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JSJS库框架 » JavaScript » 查看文章
js面向对象学习1
来源:cnblogs  作者:html55  时间:2018/10/9 10:05:45  对本文有异议

我是菜鸟,老鸟勿看,继承多态等太多概念难以理解,还是从实践中慢慢学吧!争取能大致看懂网上的开源的代码。

--------------

对象的组成:方法和属性

属性关键词:静止的,状态

方法关键词:动态的,过程,处理,带括号

--------------

js中的面向对象不是其他语言那样的面向对象。

  1. 1 <script type="text/javascript">
  2. 2 //定义arr为一个数组(数组也是一个对象实例,所以arr是个对象实例)
  3. 3 var my_arr=[];
  4. 4 //以前变量这样用,var number=10;
  5. 5 //现在定义属性,arr.number = 10; 就是用“点”即可!
  6. 6 my_arr.number = 10;
  7. 7 //定义对象的方法
  8. 8 my_arr.test = function(){
  9. 9 console.log(this);
  10. 10 //这里this就是这个数组,直接用数组名也可以
  11. 11 //alert(my_arr.number);
  12. 12 //alert(this.number);
  13. 13 }
  14. 14 //这样使用方法
  15. 15 my_arr.test();
  16. 16 </script>
  17. 17
  18. 18

结果是数组有个number属性和test方法,但是数组内容为空,length为0,但是这样alert(my_arr['number']);也可以弹出10

//TODO 以后再研究数组,但是可见,数组的内容是内容,属性和内容不是一回事,内容是数组里面存了啥,属性是这个数组实例有什么属性。如同,一个是汽车里装了谁谁,一个是汽车有车大灯的感觉。

------------

新建一个纯净的对象实例

  1. 1 <script type="text/javascript">
  2. 2 var my_obj = new Object(); //新建一个对象实例my_obj,换成 var my_obj = {}; 也行,一个意思
  3. 3 my_obj.name = '张三'; //加个属性
  4. 4 my_obj.test = function(){ //加个方法
  5. 5 this.test2(); //对象的A方法中用到对象的B方法
  6. 6 }
  7. 7 my_obj.test2 = function(){
  8. 8 console.log(this.name);
  9. 9 }
  10. 10 my_obj.test(); //使用
  11. 11 </script>

 对象中思考变量作用域的问题

以前学到变量作用域,都是函数和变量,现在加入对象,看看是怎么回事

  1. 1 <script type="text/javascript">
  2. 2 console.log(my_obj); // 显示undefined,说明解析器中和其他类型一样,根据var,先放个undefined再说
  3. 3 var my_obj = {};
  4. 4 console.log(my_obj); // 显示 Object {}
  5. 5 my_obj.name = '张三';
  6. 6 console.log(my_obj); // 显示Object {name:"张三"}
  7. 7 </script>

其实可以这样理解,js解析器,预解析,根据var找到了my_obj,赋值undefined,如果放到不用对象的时候,出个name,需要var name一下,这里由于对象var了,对象下各个目前未定义的属性就相当于已经var但没赋值了,一旦测试都是undefined。第4行,由于还没有赋予name属性,如果查看my_obj.name的话,就是undefined,而第5行赋值,第6行再看,就是“张三”了。

  1. 1 <script type="text/javascript">
  2. 2 var my_obj = {};
  3. 3 my_obj.name = '张三';
  4. 4 console.log(my_obj.test); //undefined
  5. 5 my_obj.test(); //浏览器提示出错,说test不是一个函数。可见my_obj.test = function(){...} 只是一个赋值,并没有因为是function,就扔到预解析仓库中
  6. 6 my_obj.test = function(){
  7. 7 console.log(this.name);
  8. 8 }
  9. 9 </script>
  1. 1 <script type="text/javascript">
  2. 2 var my_obj = {};
  3. 3 my_obj.name = '张三';
  4. 4 my_obj.test = xxx;
  5. 5 my_obj.test(); //这样写是可以执行的,因为函数xxx扔到预解析仓库了,上一行又赋予test这个函数了,显示张三
  6. 6 function xxx(){
  7. 7 console.log(this.name);
  8. 8 }
  9. 9 </script>
  1. <script type="text/javascript">
  2. var my_obj = {};
  3. my_obj.name = '张三';
  4. my_obj.test = function xxx(){
  5. console.log(this.name);
  6. };
  7. my_obj.test(); // 正常运行
  8. </script>
  1. 1 <script type="text/javascript">
  2. 2 var my_obj = {};
  3. 3 my_obj.name = '张三';
  4. 4 my_obj.test = function xxx(){
  5. 5 console.log(this.name);
  6. 6 };
  7. 7 xxx(); //浏览器报错,火狐认为,xxx未定义,也就是说,在等号后面的函数不会被预解析,这里不求预解析,连解析都没有
  8. 8 </script>

 

  1. 1 <script type="text/javascript">
  2. 2 var my_obj = {
  3. 3 name : "张三",
  4. 4 test : function(){
  5. 5 //对象也是个变量作用域,这里面是可以使用对象外面的函数的
  6. 6 //console.log(name); 不可以这样用,不能因为name和test平级,就不加this,属性名和变量是不同的,要加上对象名才能用
  7. 7 console.log(this.name); //console.log(my_obj.name); 这样也行
  8. 8 }
  9. 9 };
  10. 10 my_obj.test(); //显示张三
  11. 11 console.log(my_obj.name); //想使用对象的属性,就要加对象名
  12. 12
  13. 13 </script>

-----------------------

这里新建对象不够灵活,如果要建的对象名不是张三呢,而是好几个,张三,李四,王二,麻子等很多人,那么就要用到工厂方式

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号