JavaScript中面向对象编程的的一些概念-原型-构造函数等

本文探讨了JavaScript中的面向对象编程,重点介绍了类的定义、实例化和继承,以及原型、构造函数和实例之间的关系。通过ES5和ES6的对比,解析了实例化创建对象的具体流程,包括新对象的创建、__proto__链接和构造函数的调用。同时,深入讲解了原型链的工作原理,如何使用instanceof、in和hasOwnProperty()方法,并阐述了原型链在数据继承和内存优化中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类的定义,实例化,继承

ES5

function ListNode(value,next) {								//类的定义
  this.val = value;
  this.next = next;
  this.getVal = function(){
      return val;
    }
 }
node1 = new ListNode(10,null);	//实例化

function DoubleListNode(pre) {						//类的继承
      this.pre = pre;					//声明该子类特有的变量
}
class DoubleListNode.prototype = node1;

ES6

class ListNode {								//类的定义
    val;				//可以不要
    next = null;//可以不要
    constructor(value, next) {
      this.val = value;
      this.next = next;
    }
    getVal = function(){
      return val;
    }
 }
node1 = new ListNode(10,null);	//实例化

class DoubleListNode extends ListNode {						//类的继承
  constructor(value, next, pre) {
      super(value, next);			//调用父辈的构造函数
      this.pre = pre;					//声明该子类特有的变量
    }
}

原型prototype,构造函数,实例三者的关系

每一个函数都有一个prototype属性,称为该函数(可以看作构造器)的原型对象;

每一个对象都有__proto__属性,指向创造该对象的构造函数的prototype;

所有对象都是Object对象的后代,所有对象.__proto__.__proto__...最终指向Object.prototype

函数也是一种对象,所有函数都是通过Function()这个顶级构造器构造的,所以 任意函数.__proto__===Function.prototype;

Function.prototype又是一个对象,由Object()构造函数创建,所以Function.prototype.__proto__===Object.prototype;

Object()这个构造函数也是函数,所以Object.__proto__===Function.prototype;

实例化创建对象的过程

把一个函数当成普通函数调用时,结果为函数的返回值;

当成构造函数调用时,结果为该构造函数作为类名的一个新创建的对象。

具体流程

function Father(name){

        this.name = name;

}

var son = new Father(‘sonName’);

1.创建一个新对象:son;

2.新对象会被执行__proto__连接:相当于执行son.__proto__ = Father.prototype;

3.新对象和函数调用的this会绑定起来:相当于执行Father.call(son,‘sonName’);

4.执行构造函数中的代码:son.name = ‘sonName’;

5.如果函数没有返回值,那么就自动返回这个新对象:return this;

原型链

每一个对象都有__proto__属性,而obj.__proto__也是一个对象,也会有__proto__属性

故obj.__proto__.__proto__...形成一条链状结构称为原型链。

所有对象都是Object对象的后代,所有对象.__proto__.__proto__...最终指向Object.prototype,而Object.prototype.__proto__===null。

对于一个对象,访问某个方法或属性时,会沿着原型链向上查找,直到找到或达到Object.prototype为止。

instanceof运算符

object1 instanceof constructor1 //返回boolean值

instanceof 运算符用来检测 constructor1.prototype 是否存在于参数 object1 的原型链上。

可用于判断某个实例是否是某个类的实例或继承自某个类的类的实例,向上追溯来找到结果

in

使用in检查对象中是否有某个属性时,会按照原型链查找,只要在原型链中找到就返回true;

语法:node1 = new DoubleListNode(), "val" in node1 //返回true,因为node1由DoubleListNode构造,他的父辈ListNode包含val这一属性;

hasOwnProperty( )方法

可以检查对象自身是否含有该属性,而不会查找原型链。

语法:node1 = new DoubleListNode(), node1.hasOwnProperty('val') //返回false,因为DoubleListNode自身不含val,这一属性包含在他的父辈ListNode中。

原型链的作用

数据继承,实现数据共享,节省内存空间。

eg:如果在构造函数中写入方法,那么每定义一个实例都要单独开辟空间存放它自己的该方法,浪费内存空间,可以将该方法变成所有该类的实例共享的方法,做法是将该方法添加到实例的构造函数中:constructor1.prototype.fun1 = function(){ }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值