浅聊 js 原型 、原型链

对应名称 及对应关系

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

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

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

原型链的理解

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__ //不存在
 		}
	}
}

复制代码

所以可以这样说

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

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

原型链的继承的理解

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
复制代码

总结

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

如果觉得还行,请不要吝啬你的小赞赞哦。b

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享