链表数据结构之js原型链

js里面一切都是对象,包括Function Array var a = 1等;每个对象都有个__proto__属性,它指向其构造函数的
prototype,也是个对象,也是含有__proto__属性。

引入:1)typeof用来判断值是什么类型,这里有两个特殊之处,值为null object array的时候,返回结果都是:
typeof null || object || [] -->  'object'
所以要区分他们需要使用Object.prototype.toString.call()来判断,原理如下:
http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html
还有一点要注意typeof Array || Object --> 'function'

问题:为什么要调用Object.prototype.toString方法,对于数组而不能使用array.toString呢?
这要涉及到原型链了。

分析:我们知道function函数里面有个指针prototype指向原型,对象实例里面有个__proto__也指向原型,它们
的原型都是Object的一个实例,所以它们的原型里面也有个__proto__指针指向Object.prototype。当调用对象
的方法时候先在本对象本身查找是否有该方法,然后转到其原型查找,最后到Object.prototype。

重点:Array.prototype方法写了Array.toString方法,在原型链查找过程中先找到了Array.toString,便不会
往下查找,所以Object.toString方法找不到,便没有使用其最初的功能。

2)instanceof:用来判断该实例是否属于该对象,其判断原理如下: 
obj1.__proto ==> Object2.prototype ==> object3.prototype ==> Object.prototype

obj3 instaneof Object2 // true
obj3 instaneof Object // true

obj3.__proto__指向的原型是否是Object2,是返回true否则继续往下查找重复前面的动作,如果为null返回
false

3)new运算符做了哪几件事情:
function B () {} // 自动生成B.prototype.__proto__ = Object.prototype
// new
var obj = {};
obj.__ptoto__ = B.prototype;
B.call(obj);

4)Object.create()方法创建对象:
Object.create = function (proto) {
  var f = function() {}
  f.prototype = proto;
  return new f();
}
注意:它的实例__proto__指向传入的参数

5)__proto__ 和 prototype的区别:

__proto__是每个对象含有的属性,prototype是function实例的特有属性。
联系:__proto__指向其构造函数的prototype。

复制代码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值