You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
//构造函数functionPerson(){}// 虽然写在注释里,但是你要注意:// prototype是函数才会有的属性Person.prototype.name='Kevin';varperson1=newPerson();varperson2=newPerson();console.log(person1.name)// Kevinconsole.log(person2.name)// Kevin
The _proto_ property of Object.prototype is an accessor property (a getter function and a setter function) that exposes the internal [[Prototype]] (either an object or null) of the object through which it is accessed.
functionPerson(){}Person.prototype.name='Kevin';varperson=newPerson();person.name='Daisy';console.log(person.name)// Daisydeleteperson.name;console.log(person.name)// Kevin
Nearly all objects in JavaScript are instances of Object; a typical object inherits properties (including methods) from Object.prototype, although these properties may be shadowed (a.k.a. overridden).
https://wolfdu.fun/post?postId=5a22c111c7ad1346411b7264
借助文章梳理一下原型&原型链。
原型(prototype)
先看栗子:
那么prototype属性到底指向的是什么呢?
这个属性是指向的是一个对象,这个对象称为原型对象->调用该构造函数(
Person
)而创建的实例的原型,换句话说就是栗子中person1
和person2
的原型。那么原型是什么?
每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。
构造函数同实例原型关系图:
那么实例同实例原型的关系从哪里体现呢(也是就是person与Person.prototype的关系)?
我们来看下面这个属性👇
_proto_
以下是MDN解释:
__proto__是每一个JavaScript对象(除了 null )都具有的一个属性,这个属性会指向该对象的原型。
可以用一段代码验证下:
那么我们可以完善上面的关系图:
这里我知道了构造函数可以通过prototype指向原型对象,实例可以通过__proto__指向原型对象。
那么原型对象是否有属性指向构造函数或实例呢?
可以思考,一个构造函数可以生成多个实例,也就是说很多个实例可以指向同一个原型对象,所以还没有原型对象指向实例的属性。
但是原型对象指向构造函数的属性是有的👇
constructor
以下是MDN解释:
constructor,每个原型都有一个 constructor 属性指向关联的构造函数。
再次更新关系图:
至此,搞清楚了构造函数,原型对象和实例之间的关系。
👇我们来理一理实例和原型对象之间的关系。
实例与原型
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。
举个例子:
可以看到,当删除
person.name
属性的时候,再去读取name属性在person中找不到name属性,就会从person的原型person.__proto__
也就是Person.prototype
中查找,例子中的原型对象中是有name属性,所以这里得到的结果是Kevin
。但是如果没有找到呢?
如果没有找到是不是会继续向上查找原型的原型中的属性,那么原型的原型又是什么呢?
用代码说话:
如果没找到最后输出
undefined
那么原型的原型是什么?👇
原型的原型
摘自MDN
我们知道,原型也是一个对象,那么我们可以知道原型对象是通过
Object
构造函数生成的,那么我们继续更新一下关系图:既然都说了原型也是对象那么原型的原型的原型是什么呢?😸
说人话就是
Object.prototype
的原型是什么呢?可以通过代码探一探究竟:
Object.prototype
的原型竟然是null!!!阮一峰--undefined与null的区别中我们可以得知null的含义。
可以理解为,
Object.prototype
没有原型对象。最后更新关系图:
图中的蓝色链就是我们所说的原型链。
总结
prototype
属性指向的是由该函数创建(new)的实例的原型__proto__
属性指向的是该实例的原型对象constructor
属性指向关联的构造函数Object.prototype
没有原型对象(为null
表示木有)。以为到这里就完了吗???☝N☝O☝!!!
下面才是正文...😹
鸡生蛋,蛋生鸡?
先执行如下代码:
用原型链关系图来解释:Function是Function的一个实例(感觉怪怪的。。)
在JavaScript中,Function构造函数本身也算是Function类型的实例吗?Function构造函数的prototype属性和
__proto__
属性都指向同一个原型,是否可以说Function对象是由Function构造函数创建的一个实例?其实呢,不仅仅
Function.__proto__ === Function.prototype
,Object.__proto__ === Function.prototype
也为true,Array.__proto__ === Function.prototype
也为true。仔细想想其实Function,Object,Array都是一个函数与自定义的构造函数是一样的,那么我们认为Function,Object,Array都是Function的实例;
所以Function在作为构造函数时
Function.prototype
指向的是一个函数原型对象,作为函数实例时Function.__proto__
指向的也是一个函数原型对象,而这里的函数原型对象,我更倾向理解为JavaScript内置的函数对象,所以并不会出现Function对象由Function构造函数创建的情况。以下是我觉得靠谱点的解释
阅读文章:
JavaScript深入之从原型到原型链
阮一峰--undefined与null的区别
JS 的 new 到底是干什么的?
在JavaScript中,Function构造函数本身也算是Function类型的实例吗?
若文中有知识整理错误或遗漏的地方请务必指出,非常感谢。如果对你有一丢丢帮助或引起你的思考,可以点赞鼓励一下作者=^_^=
The text was updated successfully, but these errors were encountered: