You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functioncreate(){//新建空对象varobj=newObject();//获得构造函数,arguments中去除第一个参数Con=[].shift.call(arguments);//也就是说,对arguments执行shift方法//Con拿到了第一个参数即构造函数,并且arguments删除了第一个参数//原型链进行链接Object.setPrototypeOf(obj,Con.prototype);//绑定this实现继承,obj可以访问到构造函数中的属性Con.apply(obj,arguments);//返回对象returnobj;}functionCar(color){this.color=color;}Car.prototype.start=function(){console.log(this.color+" car start");}varcar=create(Car,"black");console.log(car.color);//blackcar.start();//black car start
原型与原型链
先来放张图片
要点
prototype
构造函数与其原型的关系
_proto_
注:实例对象和构造函数均可以指向原型,那原型是否有属性指向构造函数或实例呢?
constructor
实例与原型
当读取实例的属性时,如果找不到,就会查找原型中的属性,一直向上查找
注:其实在实例中,并没有constructor属性,于是查找其原型,发现有constructor属性,且指向构造函数
原型链
继承
继承其实意味着赋值操作,但是JS并不会赋值对象的属性,只是在两个对象之间创建一个关联,所以另一个对象可以通过委托访问另一个对象的属性和函数
instanceof
图解:绿色这条链便是原型链继承
new实现
new创建的实例有两大特性
模拟实现:当new Foo()执行时,会发生以下事情:
一个继承自Foo.prototype的新对象被创建
使用指定参数调用构造函数
由构造函数返回的对象就是new表达式的结果。如果
构造函数没有显式返回一个对象,则使用步骤一创建的对象
总结:
End
by wind-jyf
The text was updated successfully, but these errors were encountered: