浅聊 js 原型 、原型链

这是我参与新手入门的第3篇文章markdown

对应名称 及对应关系

  • prototype:原型 ->函数的一个默认属性:prototype:对象函数

  • __proto__:原型链 -> Object(引用类型)的一个属性(__proto__:对象)this

  • 每一个Object(引用类型)的__proto__对应着里该Object里的constructor的prototypespa

原型链的理解

function Test() {
  this.a = 1;
}
let test = new Test();
Test.prototype.b = 2;

console.log(Test.__proto__ === Function.prototype); // true
console.log('===', Test.prototype.__proto__ === Object.prototype); // true 
// 见function与Object 的特殊性

能够总结为:
test{
	a:1,
	__proto__:Test.prototype={
		b:2,
		_proto__:Object.prototype={
			__proto__ //不存在
 		}
	}
}

复制代码

因此能够这样说prototype

原型链 是以一个对象为基准,以__proto__ 为链接的这条链条,直到以Object 点上的prototype 为止的链叫作原型链。code

以对象原型为节点,连起来的一条线即为原型链orm

原型链的继承的理解

function Test() {
  this.a = 1;
}
let test = new Test();
Test.prototype.b = 2;

console.log(test.a) // 1
console.log(test.b) // 2  

当在test的直接对象里,没有找到b 属性,就回去test.__proto__里去找b 属性,这叫原型链的继承

function Test() {
  this.a = 1;
  this.b = 222;
}
let test = new Test();
Test.prototype.b = 2;

能够总结为
test{
	a:1,
	b:222,
	__proto__:Test.prototype={
		b:2,
		_proto__:Object.prototype={
			__proto__ //不存在
 		}
	}
}

console.log(test.b) // 222 当test的直接对象里,含有b属性,则再也不去__proto__里去找b属性

复制代码

Function 与 Object 的特殊性 (函数,对象)

Function

function Test(){}

底层实现:上述代码 function Test(){},是经过new Function() 构造出来的
// eg: const Test = new Function(); 

// console.log(Function.__proto__)
// console.log(Function.prototype)
// console.log(Function.__proto__ === Function.prototype) // true 特殊点记忆

复制代码

Function.__proto__ === Function.prototype对象

Object

const obj = {};
底层实现 const obj = new Objcec();
又typeof Object === 'function' ,function 底层又是经过new Function 构造出来的,
故 console.log(Object.__proto__ === Function.prototype) // TRUE
//console.log(Object.__proto__ ===  Function.__proto__)
复制代码

Object.__proto__ === Function.__proto__继承

Object.__proto__ === Function.__proto__原型链

判断属性存在的方法

// 当我看个人直接对象里是否有某个属性,能够经过hasOwnProperty('')来进行判断

test{
	a:1,
	__proto__:Test.prototype={
		b:2,
		_proto__:Object.prototype={
			__proto__ //不存在
 		}
	}
}
console.log(test.hasOwnProperty('a')); // true
console.log(test.hasOwnProperty('b')); //false

当判断对象所对应的原型链上是否有某种属性
consle.log('a' in test) //true
console.log('b' in test)  // true 

只要在链上,就为true
复制代码

总结

以上的原型链的相关知识,是以简单方法理解。实际开发中,原型链的相关知识是相对复杂的,但愿能以小见大的方式,去理解原型,原型链的相关知识。

若是以为还行,请不要吝啬你的小赞赞哦。