《Web前端开发修炼之道》笔记五:高质量JavaScript(二)

1.this关键字的指向

(这部分转自http://blog.csdn.net/kkdelta/article/details/8457358)

JavaScript中的this关键字是一个难以琢磨的概念,是一个依赖于它的执行环境而被解析的关键字。简单说就是谁调用这个方法,方法里的this就是谁.

1,在JS文件中直接alert(this);this代表的是window,当前的执行环境是在JS的顶层域里面。

2,下面这个例子中this指向的是调用该方法的对象,button标签。

[html]  view plain  copy
  1. <script type="text/javascript">  
  2.     function test() {  
  3.         alert(this.value);  
  4.         this.style.color = "red";  
  5.     }  
  6. </script>  
  7.   
  8. </head>  
  9. <body>  
  10.     <input type="button"  id="ipt" value="test this">  
  11.     <script type="text/javascript">  
  12.         document.getElementById("ipt").onclick = test;  
  13.     </script>  
  14. </body>  
  15. </html>  
上面的例子等价于下面的例子,document.getElementById("ipt").onclick相对于把test函数变成了id为 ipt元素的一个函数属性了,从而让this指向了id为 ipt元素。但是如果写成<input type="button"  id="ipt" οnclick="test()" value="test this">这样的方式调用test方法,this却是指向了window。 [html]   view plain  copy
  1. <script type="text/javascript">  
  2.     function test() {  
  3.         alert(this.value);  
  4.         this.style.color = "red";  
  5.     }  
  6. </script>  
  7.   
  8. </head>  
  9. <body>  
  10.     <input type="button"  id="ipt" value="test this">  
  11.     <script type="text/javascript">  
  12.         var button = document.getElementById("ipt");  
  13.         test.call(button);  
  14.     </script>  
  15. </body>  
  16. </html>  
3,在一个函数中,this代表这个函数的执行环境
[javascript]  view plain  copy
  1. function Test(){  
  2.     alert(this);  
  3. }  
  4.   
  5. Test();//outputs window  
  6.   
  7. var obj = new Test(); // outputs object  
Test()是在window域里执行的,其等价于window.Test();
var obj = new Test(); 其相当于 obj.Test();

2.利用map传参

比如一个函数,参数有很多,可能会有如下情况:



所以可以把需要的参数包在一个map中传入,比如:



3.面向对象

1.类定义

1)构造函数



2)原型

在声明一个类时,同时生成了一个对应的原型,例如Animal.prototype可以指向Animal类的原型,原型可以通过constructor指向Animal类的构造函数。


3)关系

1.当new Animal()时,返回的Animal实例会结合构造函数中的定义的属性、行为以及原型中定义的行为,如果有同名的,构造函数中的优先级更高。
2.一般来说,习惯把属性放在构造函数中,方便接受参数。
3.this在构造函数和原型中都指向实例对象,通过这个关键字可以让构造函数和原型实现通信。

2.公有和私有




构造函数中var的私有属性在原型中不能被访问到。
把所有的属性和行为都写在构造函数中的确是最方便的做法,但并不推荐这么做,因为内存中的原型只有一个,写在原型中的行为被所有实例共享,写在类里的行为会被每个实例复制一份。


更常见的做法:
通过命名约定来模拟私有属性:在私有属性前加上 _ ,如:this._age=20。
另外可以通过set和get方法来对属性的值进行一些约束,对值的变动进行监听。

3.继承


Bird.prototype=new Animal()使得Bird.prototype.constructor指向了Animal,所以要用Bird.prototype.constructor=Bird将它重新指回Bird。

可以进一步封装为extend函数:



4.一些别的

1.通过node.XXX的方式获取HTML标签的属性值,跨浏览器兼容性比node.getAttribute("XXX")好。但是对于自定义属性,在Firefox下,只能使用node.getAttribute("XXX")的方法。所以推荐:对于常规属性,使用前者;对于自定义属性,使用后者。

2.js改变dom节点样式的三种方式
1)如node.style.color
2)node.className=""
3)通过js增加<style></style>标签,在内部修改





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值