JavaScript原型链的那点事

函数也是一种对象,以下三种定义函数的方式本质是一样的:

function f1(m){console.log(m)}
var f2 = function(m){console.log(m)}
var f3 = new Function('m','console.log(m)')

前两种可以算是第三种的语法糖。

function Person(m){this.value=m;}
var p = new Person(8);

作用上等价于

var Person = function(m){this.value=m;}
var p = {}
p.__proto__ = Person.prototype;
Person.call(p, 8);

call改变函数体内this的值,所以p.value为8。
p.__proto__ = Person.prototype;是为了实现继承,访问p的属性xxx时,如果p没有该属性,则会去它的__proto__指向的对象中去寻找,如果还没有就继续向上层去找。__proto__实际上是一个隐藏属性,浏览器可能并不会提供。

下面是JavaScript原型链的关系图:
关系图
其中:
var Animal = function()…
var anim = new Animal()…
描述

因为Animal、Function、Object都是函数,所以它们的__proto__都指向Function.prototype。
Function和Object是特殊的函数,Function是为了可以定义普通函数,Object是为了定义其他对象。

typeof Function.prototype虽然是function,但是别的函数都有对应的prototype,它却没有,这有点不统一了,所以我认为应该不把Function.prototype看做是function。

Animal是通过new Function得到的,所以Animal.__proto__指向Function.prototype。在定义Animal的时候,也定义了Animal.prototype。

在JavaScript中,每个函数对象都有名为“prototype”的属性(除了Function.prototype),用于引用原型对象。此原型对象又有名为“constructor”的属性,它反过来引用函数本身。
其他对象的prototype的__proto__都指向Object.prototype,Object.prototype的__ptoto__指向null。

稍稍修改后的关系图:
关系图
函数原型对象的constructor属性又指向函数本身,所以可以通过anim.constructor.prototype得到Animal的原型对象,从而为其添加一些属性。

参考

http://www.blogjava.net/heavensay/archive/2013/10/20/405440.html
http://rockyuse.iteye.com/blog/1426510

by the way

有一个无符号右移运算符 >>>
对于负数,>>>先将其转换为无符号数,然后进行右移。
所以,-64>>>0就把-64转换为了无符号数。

全等号由三个等号表示(===),只有在无需类型转换运算数就相等的情况下,才返回 true。


For-in语句是严格的迭代语句,用于枚举对象的属性。
它的语法如下:
for (property in expression) statement
例子:
for (sProp in window) {
document.writeln (sProp);
}
用于显示 window 对象的所有属性。


把对象的所有引用都设置为null,可以强制性地废除对象。例如:
var oObject = new Object;
// do something with the object here
oObject = null;
当变量oObject设置为null后,对第一个创建的对象的引用就不存在了。这意味着下次运行无用存储单元收集程序时,该对象将被销毁。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值