JS面向对象编程之普通类、Function和Object的关系

JavaScript中Function和Object简单来说就是互为父亲的关系了,是不是听起来有点微妙,下面我就通过一些列子来证明这种“乱伦”的关系了。

从普通类开始
第一步定义一个Point类:

function Point (row, col) {
	this.setRow = function (row) {
		this.row = row ? row : 1;
	}

	this.setCol = function (col) {
		this.col = col ? col : 1;
	}

	this.getRow = function () {
		return this.row;
	}

	this.getCol = function () {
		return this.col;
	}

	this.toString = function () {
		return '(' + row + ", " + col + ')';
	}

	this.setRow(row);
	this.setCol(col);

}

接着创建这个类的三个对象

var point1 = new Point(4, 6);
var point2 = new Point(5);
var point3 = new Point();

输出

console.log("Point:", Point);
console.log("point1 : ", point1);
console.log("point2 : ", point2);
console.log("point3 : ", point3);

在这里插入图片描述
在这里插入图片描述
我们看到Point类有prototype属性和_proto_属性,prototype属性是指原型,而prototype是指这个类的原型链;
point1是Point的一个对象,它只有_proto_属性。
其实我们是可以通过判断是否含有prototype属性来判断它是一个类还是一个对象的,但是何为原型,何为原型链,这该怎么解释呢。

输出
console.log("point1.__proto__ === Point.prototype", point1.__proto__ === Point.prototype);

结果为 true, 可以说明一个对象的原型链和它所属类的原型指向的是同一个空间。

Point含有_prototype_属性,说明Point类其实也是父类的一个对象,它的原型链应该与它的父类的原链指向同一空间。
在这里插入图片描述
再看Point的输出结果:

在这里插入图片描述
Point类的父类其实是function,输出下面的结果

console.log("Point instanceof Function", Point instanceof Function);
 console.log("Function.prototype === Point.__proto__:", 	Function.prototype === Point.__proto__);

两个结果都为true,因此Point类的原型链和Function的原型指向了同一个空间,如图:

这么看来Function的原型链又指向了哪里呢?

console.log("Function.prototype === Function.__proto__:", Function.prototype === Function.__proto__);

它的输出结果为true,因此Function.prototype, Function.__proto__指向了同一空间。
在这里插入图片描述

但是Point类的原型和Function的原型到底是什么呢,我们来看看Object类
输出

console.log ("Object :", Object);

在这里插入图片描述
从这里我们可以看到Object类其实是Function的对象,输出`

 console.log("Object.__proto__ === Function.prototype:", Object.__proto__ === Function.prototype);

的结果为true,因此有下图:
在这里插入图片描述

从上图可以看到,Point,Function和Object的原型都还没有指向,我们输出:

 console.log("Point.prototype instanceof Object", Point.prototype instanceof Object);
   console.log("Function.prototype instanceof Object", Function.prototype instanceof Object);

结果都为true,证明所有类的原型其实都是一个Object类的对象,则这个对象的_prototype_所指向的空间就是Object类的原型所指向的空间:

 console.log("Point.prototype.__proto__ === Object.prototype", Point.prototype.__proto__ === Object.prototype);
    console.log("Function.prototype.__proto__ === Object.prototype",  Function.prototype.__proto__ === Object.prototype);

它们的结果为true,最后形成的图像如下:

在这里插入图片描述
最后我们输出

 console.log("Object.prototype.__proto__:", Object.prototype.__proto__);

结果为null,相当于一个链表的末节点。

console.log("Object instanceof Function:", Object instanceof Function);
console.log("Object instanceof Object:", Object instanceof Object);
console.log("Function instanceof Object:", Function instanceof Object);

这三行代码的输出结果都为true,因此就可以证明刚开篇提到的Function与Object之间互为父类的复杂关系了,Object是Function 的一个对象,Function也是Object的一个对象,值得注意的是Object类也是自己的一个对象。
不得不说JavaScrip里面的关系是在是太复杂了~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值