js 原型链
2019-02-22 本文已影响0人
_旁观者_
知识点
1, 只要是函数就有 prototype
,__proto__
, 只要是对象就有 __proto__
属性
![](https://img.haomeiwen.com/i14924407/8fb508b9c5995a66.png)
![](https://img.haomeiwen.com/i14924407/d78d9a08841bef01.png)
2, 通过构造函数
可以创建实例对象
,实例对象
的 __proto__
指向 构造函数
的 prototype
_proto_
作用是指向其构造函数的prototype , 且构造函数的prototype
是一个对象
![](https://img.haomeiwen.com/i14924407/ee698e7f9be1b46f.png)
注意是
构造函数的prototype
,而非构造函数,因此在创建构造函数时,如果要添加属性方法只能添加到 构造函数的prototype
上,实例对象才能被继承
3,函数的 prototype
属性中有constructor
,该属性指向函数本身
![](https://img.haomeiwen.com/i14924407/de15db9576f5bca6.png)
通过创建实例对象解释原型链
- var obj = {} 方法创建
var obj = {}
console.log(obj.__proto__ === Object.prototype)
console.log('Object.prototype', Object.prototype)
console.dir(Object.prototype.__proto__)
结果如下:
![](https://img.haomeiwen.com/i14924407/57e5b69a97d107cd.png)
原型链为:
![](https://img.haomeiwen.com/i14924407/8c2b084f1123fa5a.png)
- 通过构造函数创建对象和函数的原型链
- 1 对象
function Person (name, age) { this.name = name; this.age = age; } var person1 = new Person('张三', 14) console.log(person1)
如图:
原型链为:
- 2 函数
var fn = new Function()
console.dir(fn)
打印结果:
![](https://img.haomeiwen.com/i14924407/f7bcedcd458e410f.png)
原型链:
![](https://img.haomeiwen.com/i14924407/c42bcc4dc62c0d7b.png)
- 3 Object.create(Obj) 创建对象
实现原理:
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
_相当于创建一个实例对象, 对象的 __proto__
指向的是传入的参数(即对象本身),而不是 对象的prototype
_
var ob = {}
var aaa = Object.create(ob)
console.log(aaa)
console.log(aaa.__proto__ === ob)
console.log(ob.__proto__ === Object.prototype)
![](https://img.haomeiwen.com/i14924407/0d30eca2ab6dfdbe.png)
原型链图:
![](https://img.haomeiwen.com/i14924407/b01287b2f4730a2c.png)
补充
var aa = function () {}
console.log(aa.prototype.__proto__ === aa.__proto__.__proto__) // true
// 可以把实例函数 aa.prototype 看做 { constructor: aa,__proto__:Obeject.prototype对象 }