前端那些事系列之基础篇面向对象和原型、原型链(七)

面向对象

“基于类”的编程提倡使用一个关注分类和类之间关系开发模型。在这类语言中,总是先有类,再从类去实例化一个对象。比如JAVA
类与类之间又可能会形成继承、组合等关系。类又往往与语言的类型系统整合,形成一定编译时的能力。
“基于原型”的编程看起来更为提倡程序员去关注一系列对象实例的行为,而后才去关心如何将这些对象,划分到最近的使用方式相似的原型对象,而不是将它们分成类。比如JS
原型:一系列对象行为的集合。
造车:工程图纸就是类,按工程图纸造车就是基于类的面向对象编程;人就是构造器constructor,工具就是prototype,人用工具去造车就是基于原型的面向对象编程。

原型、原型链

每个函数都有一个默认的原型属性,指向一个空对象,这个空对象就是原型;
所有实例化的对象都是这个原型继承的;
原型对象中有一个属性叫constructor,指向这个函数;
函数具有的prototype是显示原型,实例对象具有的__proto__是隐式原型;
对象的隐式原型的值为其对应构造函数的显式原型的值。
函数的prototype属性: 在定义函数时自动添加的, 默认值是一个空Object对象
对象的__proto__属性: 创建对象时自动添加的, 默认值为构造函数的prototype属性值
程序员能直接操作显式原型, 但不能直接操作隐式原型(ES6之前)。
实例对象与原型之间的连接,叫做原型链
1、每个对象都有一个proto属性,原型链上的对象正是依靠这个属性连结在一起
2、作为一个对象,当你访问其中的一个属性或方法的时候,如果这个对象中没有这个 方法或属性,那么Javascript引擎将会访问这个对象的proto属性所指向上一个对 象,并在那个对象中查找指定的方法或属性,如果不能找到,那就会继续通过那个对象 的proto属性指向的对象进行向上查找,直到这个链表结束。

new 关键字原理

定义一个可以传入构造函数的function;
定义一个实例化对象obj=Object.create(null);
将当前obj.proto=Constrctor.prototype;
let result=Constructor.apply(obj,…argument);
obj的作用域指向传进来的构造函数的作用域;
return的时候判断result是对象就返回result,不是就返回obj
因为当构造函数return的时候,如果return的是基础类型(num、string、boolean、undefined、null);就会忽略,指向的还是构造函数;但return的是引用数据类型,那么实例化的对象就只能从返回的引用数据类型中得到,所以需要let _result=Constructor.apply(obj);
如果_result instanceof Object true的话,那么就返回当前return的引用对象,如果不是Object的话那么就可以忽略,直接返回当前的实例化对象。

//模拟实现new
function _new(func,argument){
	let obj=Object.create(null);
	obj.__proto__=func.prototype;
	let result=func.apply(obj,...argument);
	return result instanceof Object?result:obj;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值