js的原型链
js是原型上的语言,它是万物皆可对象的,它的对象之间是靠原型串连在一起的,而他们之所以能够串连在一起是靠两个内置的属性
- proto
- prototype 原型对象
他们把对象之间连接在一起,形成原型链!!!
js对象分为函数对象和普通对象
函数对象
函数对象可以理解为我们平常定义的函数
如下
function f1(){};
var f2 = function(){};
var f3 = new Function('str','console.log(str)');
这些都是函数对象,构造器也是函数对象,就是函数
普通对象
普通对象就是我们平常经常喊的对象,比如json对象
如下
var o1 = {};
var o2 =new Object();
var o3 = new f1();
var o4={
name:'原型'
}
这些都是普通对象对象
原型对象prototype 和_proto_
原型对象 prototype
原型对象prototype是函数对象特有的!!!
原型对象prototype是普通对象,但是 Function.prototype 除外,这个是一个函数对象,并且没有 prototype 属性
要记住上面这一点,普通对象是没有的!!!
prototype原型对象是函数对象特有的- 每一个原型对象
prototype都有一个constructor构造函数属性,这个属性指向又是它对应的那个构造函数本身,即是Person.prototype.constructor == Person - 原型对象
prototype是普通对象 prototype的proto指Object的原型对象
所有对象的___proto___属性
- 所有的对象里都有_proto_属性
- proto会指向构造他的函数对象的原型对象
prototype!!!
图示
当我有以下代码的时候
<script>
function Person(name) {
this.name = name;
this.age = 18;
this.sayName = function() {
console.log(this.name);
}
}
// 第二步 创建实例
var person = new Person('person')
console.log(person.__proto__ === Person.prototype);
console.log(Person.__proto__ === Function.prototype);
console.log(Person.prototype.__proto__ === Object.prototype);
console.log(Object.__proto__ === Function.prototype);
</script>
我理解的原型链是这样
如下图