首页 > 编程知识 正文

js原型和原型链的概念(javascript的特点)

时间:2023-05-05 18:14:54 阅读:82118 作者:4879

原文: 3359 WWW.Jian Shu.com/p/53c 2353 DF0C 4

深入了解JavaScript原型后,您会遇到一些概念、原型、构造函数和原型链。 下面,用图解来看一下吧。

构造函数

首先从构造函数创建对象,然后创建实例属性

函数人员()

//prototype

person.prototype.name='小明';

let人员1=新人员(;

let人员2=新人员(;

控制台日志(人员1.name;//小明

控制台日志(人员2.名称;//小明

在这里,提出了构造函数的prototype属性所指向的实例原型的概念。 在这里,我怀疑prototype是不是原型。 真的是这样吗? 从下面可以看到,函数的prototype属性实际上是指通过调用构造函数创建的实例的原型,即本例中的person1和person2的原型。 通过下图,可以了解上面的构造函数和实例原型之间的关系。

那么,到这里为止,我们的实例对象和实例原型直接是什么关系呢? 此时,它会引出__proto__属性,即对象和实例原型之间的直接联系。 MDN中进行了如下说明。

Object.prototype的__proto__属性是存取器的属性,将公开所获取对象的内部[[Prototype]]。 大多数浏览器支持通过这种非标准方法访问原型,但不存在于Person.prototype中,实际上来自Object.prototype,与其说是属性,不如说是getter/setter

函数人员()

let人员=新人员(;

控制台.日志(人员_ _属性_===人员.属性); //true

此时,添加实例对象与实例原型之间的关系图

下面是这个非正式属性的一些注意事项。 请参阅MDN。

警告:为了方便现代浏览器的操作属性,可以更改对象的“prototype”属性。 此行为在所有JavaScript引擎和浏览器中都非常缓慢,并且会影响性能,因此通过这种方式更改和继承属性会对性能产生非常大的影响。 此外,性能所需的时间也不会简单地花在obj.__proto__=.语句上,而是会影响从[[Prototype]]继承的所有对象。 如果您对性能感兴趣,则不应该在单个对象中更改其[ prototype ]。 相反,建议使用Object.create ()创建可以继承[[Prototype]]的新对象。

接下来,让我们看看构造函数和实例原型之间的关系。 虽然实例原型在这里并不指向实例,但它具有指向构造函数的构造函数,如图所示。

函数人员()

let人员=新人员(;

控制台日志(人物属性==人物属性)//真

console.log (person.prototype.constructor==个人)//true

至此,我们明确了实例、构造函数和实例原型的关系,然后进入下一步。 我们知道所有的JavaScript都是对象。 这个实例的原型也是对象啊。 那么,你指的是谁呢?

原型链

导入实例的属性时,如果在实例中找不到该属性,请查找与该对象关联的原型的属性,如果还没有找到该属性,请查找原型的原型至顶层。

函数人员()

var person=新person (;

控制台日志(个人名称)//未定义

person.prototype.name='小明';

person.name='hhh ';

控制台日志(人物名称)//hhh

delete个人名称;

控制台日志(人物名称)//小明

如果首先实例化构造函数以获得对象,然后在未添加属性时将其打印,则该对象将变为未定义。 在向实例原型添加属性的同时也向对象添加属性。 打印时,如果在对象中发现属性,则不会向上移动。 如果删除对象属性,可以看到它从实例原型往上移动。 使用person.__proto__,如果实例正好有数据,则获取数据。此时,我们进入下一步,看看实例原型的实例原型是什么~

如果没有扩展原型链,我们的原型图就会变成这样,指向Object.prototype。 在这里结束吗? Object.prototype指的是谁呢? 印刷发现是指空值。 在此,请参考sldsj的undefined和null的区别。 这里并不表示对象的原型为空,而是表示对象是顶级对象。 也就是说,如果找到Object.prototype,就停止搜索,没有更多的了。 最终的原型图如下所示。

//这里并不表示Object的原型为null,而是表示没有原型

控制台日志(对象.属性. _ _属性==空值)//真

总结:

函数的prototype属性是指原型,prototype是原型并不严格,原型链通过__proto__链接。 其中,prototype是函数的属性,不表示原型。 person.prototype是指person实例的原型,即person实例的原型

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。