这篇文章主要介绍“JavaScript中的原型和原型链怎么理解”,在日常操作中,相信很多人在JavaScript中的原型和原型链怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript中的原型和原型链怎么理解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
先知道对应关系
prototype
:原型__proto__
:原型链(链接点)
从属关系
prototype
: 函数的一个属性 -> 不要想的太复杂,其实就是一个普通对象{}__proto__
: 对象上的一个属性 -> 不要想的太复杂,其实就是一个普通对象{}对象的
__proto__
保存着对象的构造函数的prototype
函数是特殊对象 所以
__proto__
在函数上也是存在的,且是个function
大家经常忽略忘记的一点:Object
是个方法(构造函数),new Object
是个实例对象!!!
console.log(Object) //typeof Object ==='function'
console.log(new Object) //typeof new Object ==='object'
constructor
constructor
就是实例化对象的构造函数
//test.constructor -> 实例化test对象的构造函数 Test
console.log(test.constructor===Test) //true
//这里个人理解为永无止境的自身调用自身,求解,没找到相关文章。
console.log(test.constructor.prototype.constructor===Test) //true
console.log(test.constructor.prototype.constructor.prototype.constructor===Test) //true
//constructor允许更改
function Test2() {
this.a=123
}
test.constructor=Test2
console.log(test)
原型
function Test(){}
let test=new Test() //new完之后 test是个实例对象了
console.log(test.__proto__===Test.prototype) //根据上面的对应关系表 可以知道结果为true
//Test.prototype也是一个对象,所以他必须也得有__proto__
//Test.prototype.__proto__已经到达终点了,终点是什么,终点就是Object构造函数,所以下面结果为ture
console.log(Test.prototype.__proto__.constructor===Object)
//且 按照上面对应关系中的规则和上条的结果,下条结果也是ture
console.log(Test.prototype.__proto__===Object.prototype) //
//终点为null
console.log(Object.prototype.__proto__) //null
能不能描述一下原型链
对象的__proto__
保存着对象的构造函数的prototype
,prototype
又是个对象,所以也有自己的__proto__
,这样往复到终点Object.__proto__
,这样就形成了一个以__proto__
为链接点(为key
)值为构造方法的prototype
对象的一根链条, 即为原型链。
//__proto__
test{
b:333,
a:1,
__proto__:Test.prototype={
c:222,
b:2,
__proto__:Object.prototype={
c:3,
__proto__:null
}
}
}
特殊的函数对象
重点:JS中,函数是一种特殊的对象!!!
记住文章开头的对应关系表
//函数是特殊对象 所以__proto__是存在的,且是个function
console.log(Test.__proto__) //function
console.log(Test.prototype) //object
Test
既然是个函数,那么底层必然也是new Function
实现的,那么
//对象的__proto__保存着对象的构造函数的prototype
console.log(Test.__proto__===Function.prototype) //true 这里是不是和关系表对应上了,能正常理解
const obj={}
const obj2=new Object()
console.log(Object) //function
console.log(typeof Object) //'function'
Function
既然是个构造函数,那么他是不是也应该有__proto__
和prototype
,是的,但是这里有一个特殊的点需要记住。
底层规则规定 :Function.__proto__===Function.prototype
是相等的,且两者返回的都是一个function,我的理解是Function
自己构造了自己。
//正常来说函数的Test.prototype应该是个object,
//Function.prototype是个function,这也是一个特殊的点
typeof Test.prototype==='object' //true
console.log(Function.__proto__) // 一个function
console.log(Function.prototype) // 一个function
//Function既然是函数对象_,那么他的_proto__就指向他的构造函数的prototype,也就是
//Function.__proto__===Function.prototype,自己调自己,这样理解是不是也没毛病。
console.log(Function.__proto__===Function.prototype) //true
//Object既然是个构造方法,那么底层也是new Function
console.log(Object.__proto__===Function.prototype) //true
// 因为Function.__proto__===Function.prototype 所以下面代码是成立的
(Object.__proto__===Function.__proto__)===true
hasOwnProperty和in
hasOwnProperty
hasOwnProperty
用来判断是否是对象自身的属性(非原型链继承过来的)
let test={
a:1,
b:2
}
Object.prototype.c=3
console.log(test.hasOwnProperty('a')) //true
console.log(test.hasOwnProperty('b')) //true
console.log(test.hasOwnProperty('c')) //false
in
in
用来检查对象是是否包含某个属性(包含原型链上的属性)
console.log('a' in test) //true
console.log('b' in test) //true
console.log('c' in test) //true
console.log('toString' in test) //true
console.log('d' in test) //false
到此,关于“JavaScript中的原型和原型链怎么理解”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!