JavaScript继承与原型链--控制台显示

1.继承

当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(object)都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象(__proto__),层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。

这句话是摘自mdn,这篇文章也只是所摘文章的实践https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

原型链上数据查找的规则

先看一下段代码

		function dosomething(){
			this.a = 1;
			this.b = 2;
		}
		dosomething.prototype.a = 3;
		dosomething.prototype.d = 4;
		var todosomething = new dosomething()
		console.log(todosomething.a)//结果是:1
		// 原型上也有一个'a'属性,但是它不会被访问到。
		// 这里的'a'是todosomething自身的属性
		// 这种情况被称为"属性遮蔽 (property shadowing)"
		// 说白了就是访问某个属性时自身有这个属性,那么就不沿着原型链上找了
		
		console.log(todosomething.d)//结果是:4
		// 这里的'd'不是todosomething自身的属性
		// 先在自身的实例化对象上找'd'属性,没找到,去实例化对象的原型上找,原型上有为4
		
		console.log(todosomething.e)//结果是:undefined
		// 整条链上都找不到'e'属性,返回undefined
		
		Object.prototype.e = 5;
		console.log(todosomething.e)//结果是:5
		// 这里Object.prototype.e没有声明提升

 这里todosomething对象中只有a,b两个属性,所以访问时程序上直接就能访问,然后是d属性,实际上todosomething对象并没有这个属性,但因为dosomething.prototype有'd’属性,所以todosomething.d仍能获取属性值,还有todosomething访问‘e’属性,由于本身没有,就去本身的原型上去找,本身的原型上没有,上Object.prototype上找,在Object找到了就拿来用了,其实这里我的理解就是todosomething对象继承了他们身上的属性。同时这解决了一个困惑了我很久的问题,就是实例化对象的constructor属性是哪来的,其实就是继承自构造函数的原型。

2.原型链

我把上面代码的todosomething对象进行打印

console.log(todosomething)

上面图片第一行的 dosomething代表是他本身的实例化对象,[[prototype]]就相当于_proto_(从mdn得出: 遵循ECMAScript标准,someObject.[[Prototype]] 符号是用于指向 someObject 的原型。从 ECMAScript 6 开始,[[Prototype]] 可以通过 Object.getPrototypeOf() 和 Object.setPrototypeOf() 访问器来访问。这个等同于 JavaScript 的非标准但许多浏览器实现的属性 __proto__。)上面constructor的属性值是产生自己的构造函数。

然后上面的图就可以变为一条链:dosomething构造函数的实例化对象就是todosomething,todosomething._proto_就是dosomething构造函数的原型对象,接着todosomething._proto_.proto所查询的对象就是Object构造函数的原型对象。(通过constructor就能看构造函数,就是上图的控制台的constructor)

你可能感兴趣的:(js,javascript,原型模式,开发语言)