知识大全 JavaScript中几个重要的属性

Posted 函数

篇首语:百艺通,不如一艺精。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JavaScript中几个重要的属性相关的知识,希望对你有一定的参考价值。

JavaScript中几个重要的属性  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  this this表示当前对象 如果在全局作用范围内使用this 则指代当前页面对象window 如果在函数中使用this 则this指代什么是根据运行时此函数在什么对象上被调用 我们还可以使用apply和call两个全局方法来改变函数中this的具体指向 先看一个在全局作用范围内使用this的例子

代码如下: <script type=> console log( === window); console log(window alert === alert); console log( parseInt( )); </script>

   函数中的this是在运行时决定的 而不是函数定义时 如下

代码如下: foo() console log( fruit); fruit = ; foo(); pack = fruit: foo: foo ; pack foo();

   全局函数apply和call可以用来改变函数中this的指向 如下

代码如下: foo() console log( fruit); fruit = ; pack = fruit: ; foo apply(window); foo apply(pack);

   注 apply和call两个函数的作用相同 唯一的区别是两个函数的参数定义不同 因为在JavaScript中函数也是对象 所以我们可以看到如下有趣的例子

 代码如下: foo() ( === window) console log(); foo boo = () ( === foo) console log(); ( === window) console log(); ; foo(); foo boo(); foo boo apply(window);

   prototype prototype本质上还是一个JavaScript对象 并且每个函数都有一个默认的prototype属性 如果这个函数被用在创建自定义对象的场景中 我们称这个函数为构造函数 比如下面一个简单的场景

 代码如下: Person(name) name = name; Person prototype = getName: () name; zhang = Person(); console log(zhang getName());

   作为类比 我们考虑下JavaScript中的数据类型 字符串(String) 数字(Number) 数组(Array) 对象(Object) 日期(Date)等 我们有理由相信 在JavaScript内部这些类型都是作为构造函数来实现的 比如 Array() arr = Array( ); arr = [ ]; 同时对数组操作的很多方法(比如concat join push)应该也是在prototype属性中定义的 实际上 JavaScript所有的固有数据类型都具有只读的prototype属性(这是可以理解的 因为如果修改了这些类型的prototype属性 则哪些预定义的方法就消失了) 但是我们可以向其中添加自己的扩展方法 Array prototype min = () min = [ ]; ( i = ; i < length; i++) ([i] < min) min = [i]; min; ; console log([ ] min()); 注意 这里有一个陷阱 向Array的原型中添加扩展方法后 当使用for in循环数组时 这个扩展方法也会被循环出来 下面的代码说明这一点(假设已经向Array的原型中扩展了min方法) arr = [ ]; total = ; ( i arr) total += parseInt(arr[i] ); console log(total); 解决方法也很简单 arr = [ ]; total = ; ( i arr) (arr hasOwnProperty(i)) total += parseInt(arr[i] ); console log(total); constructor constructor始终指向创建当前对象的构造函数 比如下面例子

代码如下: arr = [ ]; console log(arr constructor === Array); Foo = () ; console log(Foo constructor === Function); obj = Foo(); console log(obj constructor === Foo); console log(obj constructor constructor === Function);

   但是当constructor遇到prototype时 有趣的事情就发生了 我们知道每个函数都有一个默认的属性prototype 而这个prototype的constructor默认指向这个函数 如下例所示

 代码如下: Person(name) name = name; ; Person prototype getName = () name; ; p = Person(); console log(p constructor === Person); console log(Person prototype constructor === Person); console log(p constructor prototype constructor === Person);

   当时当我们重新定义函数的prototype时(注意 和上例的区别 这里不是修改而是覆蓋) constructor的行为就有点奇怪了 如下示例

代码如下: Person(name) name = name; ; Person prototype = getName: () name; ; p = Person(); console log(p constructor === Person); console log(Person prototype constructor === Person); console log(p constructor prototype constructor === Person);

   为什么呢? 原来是因为覆蓋Person prototype时 等价于进行如下代码操作

 代码如下: Person prototype = Object( getName: () name; );

   而constructor始终指向创建自身的构造函数 所以此时Person prototype constructor === Object 即是

 代码如下: Person(name) name = name; ; Person prototype = getName: () name; ; p = Person(); console log(p constructor === Object); console log(Person prototype constructor === Object); console log(p constructor prototype constructor === Object);  代码如下: Person(name) name = name; ; Person prototype = Object( getName: () name; ); Person prototype constructor = Person; p = Person(); console log(p constructor === Person); console log(Person prototype constructor === Person); console log(p constructor prototype constructor === Person);  cha138/Article/program/Java/JSP/201311/20262

相关参考

知识大全 在.net开发中几个重要的认识误区

  net如今已经很流行成为赶时髦的程序员的首选但是大量刚刚接触net的程序员的确存在一定的认识误区这里先介绍一部分  一net程序再运行一次就会更快  许多人对此的解释是net程序第一次运行时会被编

知识大全 在.net开发中几个重要的认识误区(1)

  如今已经很流行成为赶时髦的程序员的首选但是大量刚刚接的程序员的确存在一定的认识误区这里先介绍一部分  一程序再运行一次就会更快  许多人对此的解释是程序第一次运行时会被编译成本地代码所以再次运行会

啤酒厂废水COD测定中几个应注意的问题

啤酒厂生产废水中因有大量粒、块状的悬浮物,均匀性很差,而它又是造成此类废水耗氧的重要因素。啤酒厂处理后废水由于处理工艺的原因(加入了大量盐酸来中和碱性物质)含有大量的氯离子,一般在300mg/L左右。

啤酒厂废水COD测定中几个应注意的问题

啤酒厂生产废水中因有大量粒、块状的悬浮物,均匀性很差,而它又是造成此类废水耗氧的重要因素。啤酒厂处理后废水由于处理工艺的原因(加入了大量盐酸来中和碱性物质)含有大量的氯离子,一般在300mg/L左右。

啤酒厂废水COD测定中几个应注意的问题

啤酒厂生产废水中因有大量粒、块状的悬浮物,均匀性很差,而它又是造成此类废水耗氧的重要因素。啤酒厂处理后废水由于处理工艺的原因(加入了大量盐酸来中和碱性物质)含有大量的氯离子,一般在300mg/L左右。

知识大全 详解JavaScript对象属性应用

详解JavaScript对象属性应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  docume

知识大全 用JavaScript修改CSS属性

用JavaScript修改CSS属性  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  只有写原生的

知识大全 javascript检测对象中是否存在某个属性判断方法

  检测对象中属性的存在与否可以通过几种方法来判断  使用in关键字  该方法可以判断对象的自有属性和继承来的属性是否存在  代码如下:  varo=x:;  "x"ino;//true自有属性存在 

知识大全 JavaScript常用全局属性与方法记录积累

JavaScript常用全局属性与方法记录积累  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最

知识大全 javascript中自定义对象的属性方法分享

这篇文章介绍了在javascript中自定义对象的属性方法有需要的朋友可以参考一下   首先介绍下关联数组复制代码代码如下:<script>vartest=newObject()