原型链相关内容
akong 2018-12-12 21:02:34 原型继承
再来总结一下关于原型的一些相关知识。
# 原型链
# 原型链神图
# 创建对象的方法
字面量对象
var obj1 = {name: 'obj1'}
1new Object(obj)
var obj2 = new Object({name:'obj2'})
1构造函数
var foo = function (name) { this.name = name } var obj3 = new foo()
1
2
3
4Object.create(obj)
var P = {name: 'obj4'} var obj4 = Object.create(P)
1
2第二行代码的效果:
obj4.__proto__ = P
此时obj4本身为空函数,但是原型链上具有name属性
# instanceof的原理
A instanceof B
查看对象B的
prototype
属性指向的对象(原型对象)是否在对象A的[[prototype]]/__proto__
链上
也就是说,B不管是A的爸爸 还是A的爷爷,都返回true
怎么只检测爸爸而不检测爷爷呢
我们可以使用constructor属性
A.__proto__.constructor===B
这样就能判断父子关系了。
# new运算符
new运算符执行的时候,大致可以分为一下步骤:
实例构造函数为foo
- 一个新对象被创建。它继承自
foo.prototype
- 构造函数开始执行。
执行的时候,相应的传参会被传入,上下文
this
指定为这个新实例。 new foo 等同于new foo () 不传参 - 如果构造函数返回了一个对象,那么new出来的结果就是这个对象。 如果构造函数没有返回对象,那么new出来的结果就是上述步骤常见出来的对象。
根据以上规则手写实现一个new运算符:
var mynew = function (func) {
// 第一步
var o = Object.create(func.prototype)
// 第二步
var k = func.call(o)
// 第三步
if (typeof k === 'object') {
return k
} else {
return o
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
更多关于原型的内容可以看之前发的博客文章 原型prototype和__proto__