js的原型链

76 阅读1分钟

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是普通对象
  • prototypeprotoObject的原型对象

所有对象的___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>

我理解的原型链是这样

如下图