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。
复制代码
链表数据结构之js原型链
最新推荐文章于 2022-01-27 12:59:05 发布