原型的定义:
一个对象的一些属性和方法,可以通过原型模式创建一个新的对象实例,并会继承和共享这个对象的所有属性和方法。
我们先看一段代码和返回值
<script>
function Person(name) {
this.name = name;
}
Person.prototype.son = function() {
console.log("Hello", this.name); // Hello Tom
}
var MyFather = new Person("Tom");
MyFather.son();
console.log(MyFather); // Person {name: "Tom", __proto__:...}
</script>
![](https://i-blog.csdnimg.cn/blog_migrate/193169cde8fec70bc2a42752720d3e88.png)
总结:
所有的对象都有一个__proto__(隐式原型)的属性,所有的函数也都有一个prototype属性,每个原型属性下都有一个constructor构造方法,同时指向它本身构造方法的引用地址,所有对象的__proto__属性都会有指向object对象,object对象的prototype属性下的__proto__属性指向null:object.prototype.__proto__ === null
![](https://i-blog.csdnimg.cn/blog_migrate/924211f2c7c6db92b18ff7957fca254c.png)
原型链的定义:
原型链是原型对象创建过程的历史记录,当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构
prototype 和 proto 区别是什么?
1、prototype是构造函数的属性
2、__proto__是每个实例都有的属性,可以访问 [[prototype]] 属性
3、实例的__proto__与其构造函数的prototype指向的是同一个对象