自己探索一下原型链。草稿
在学习对象和函数的时候,一直傻傻分不清他们的关系。此文搞懂原型和原型链的知识点
先说一下js的类型。
基本数据类型:number,string,null,undefined,bool。
引用数据类型:Object(对象),Function,Array,Data。
这个object就很奇怪嗷。为什么能被称为引用数据类型呢?
一 对象。
创造对象的方法有两种。一个是new,一个字面量{}。两个效果相等。
var obj = new Object();
var obj2 = obj1;
obj2.name = '我有名字了';
console.log(obj1.name)//我有名字了。
(基本数据结构类型在栈中,而引用数据类型保存在堆中。但是JS语言不能直接在堆中进行操作,只能通过引用地址找到保存在堆中的对象。)
obj1,obj2这是我们通过new进行创建的对象。
这里有两个问题。
1 new创建对象过程中发生了什么?
2 创造出的对象obj1,obj2有什么属性?
我们打开控制台先回答第二点。
除了name的属性以外,还有_proto_属性,photo是照片,proto是什么意思?嗷,原来是原型的意思。
我们把name属性删掉,这个时候打开控制台再看。怎么还有proto呢?我们先保留这个问题。
函数的属性prototype里面还有proto。并且和对象的proto一摸一样。
二 函数
function sayName(a) {
name = '我有名字了';
return name;
}
sayName函数里面除了name属性,还有prototype属性,还有constructor,以及__proto__。这个属性是什么东东呢?
1 console.log(sayName.constructor);
2 console.log(sayName.__proto__);
3 上面的乏善可陈,我们看看prototype。我天,prototype属性里面怎么还有proto和constructor呢。
3.1 console.log(sayName.prototype)
我们先看一下constructor。里面还有prototype以及proto。
这个时候我们先看一下 :
3.11console.log(sayName.prototype.constructor)(等价于 :console.log(sayName);)
明白了 prototype属性里面有constructor,会指向回来的值。我们在后面再加.prototype.constructor,会指向回来!!!
函数有一个属性 叫property。
property有一个constructor,指向函数。
我们再看constructor里面有什么?
3.12 console.log(sayName.prototype.constructor.protype.constructor)等价于 :console.log(sayName);
这个就到此一段停止了!!!我们看看prototype的__proto__;
3.2 console.log(sayName.prototype.__proto__);
这个里面还有constructor,是不是也是指向回去的呢?控制台看一下竟然不是!!!!
console.log(sayName.prototype.__proto__.constructor);
console.log(sayName.prototype.__proto__.prototype);