面向对象编程概述和NEW的实现原理

面向对象编程(OOP)

OOP(Object Oriented Programming):面向对象程序设计
POP(Procedure /prəˈsiːdʒər/ Oriented):面向过程程序设计

对象:万物皆对象
类:对象的细分
实例:类中具体的事物

JS也是面向对象编程:类、实例

  • 1 ->Number
  • ‘A’ ->String
  • true ->Boolean
  • null ->Null
  • undefined ->Undefined
  • [] ->Array
  • /^$/ ->RegExp
  • function(){} ->Function
  • {} ->Object

每一个元素标签(元素对象)都有一个自己所属的大类

  • div -> HTMLDivElement -> HTMLElement -> Element -> Node -> EventTarget -> Object
  • 每一个实例可以调用所属类(整条链)中的属性和方法

普通函数执行

  • 形成一个全新的执行上下文EC
    
  • 形成一个AO变量对象
    
  •    ARGUMENTS
    
  •    形参赋值
    
  • 声明其THIS指向
    
  • 初始化作用域链
    
  • 代码执行
    

创建一个自定义类

  • 创建一个函数(Function类的实例),直接执行就是普通函数,但是“new 执行”它则被称为一个自定义的类
    
  • NEW 函数执行
    
  • 形成一个全新的执行上下文EC
    
  • 形成一个AO变量对象
    
  •    ARGUMENTS
    
  •    形参赋值
    
  • 初始化作用域链
    
  • [新]默认创建一个对象,而这个对象就是当前类的实例
    
  • [新]声明其THIS指向,让其指向这个新创建的实例
    
  • 代码执行
    
  • [新]不论其是否写RETURN,都会把新创建的实例返回(特殊点)
    

NEW 关键点

  • 因为具备普通函数执行的一面,所以只有this.xxx=xxx才和创建的实例有关系
  • 【特殊点】用户自己返回内容,如果返回的是一个引用类型值,则会把默认返回的实例给覆盖掉(此时返回的值就不在是类的实例了)
  • 每一次new出来的都是一个新的实例对象(一个新的堆内存)
  • instanceof用来检测某一个实例是否属于这个类
function Dog(name) {
	this.name = name;
}
Dog.prototype.bark = function () {
	console.log('wangwang');
};
Dog.prototype.sayName = function () {
	console.log('my name is ' + this.name);
};

		/* 
		 * 内置NEW的实现原理 
		 * @params
		 *    Func:操作的那个类
		 *    ARGS:NEW类的时候传递的实参集合
		 * @return
		 *    实例或者自己返回的对象
		 */
		 
function _new(Func, ...args) {
	//默认创建一个实例对象(而且是属于当前这个类的一个实例)
	// let obj = {};
	// obj.__proto__ = Func.prototype; //=>IE大部分浏览器中不允许我们直接操作__proto__
	let obj = Object.create(Func.prototype);

	//也会把类当做普通函数执行
	//执行的时候要保证函数中的this指向创建的实例
	let result = Func.call(obj, ...args);

	//若客户自己返回引用值,则以自己返回的为主,否则返回创建的实例
	if ((result !== null && typeof result === "object") || (typeof result === "function")) {
		return result;
	}
	return obj;
}
let sanmao = _new(Dog, '三毛');
sanmao.bark(); //=>"wangwang"
sanmao.sayName(); //=>"my name is 三毛"
console.log(sanmao instanceof Dog); //=>true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值