原型、原型链也是一个老生常谈的问题了,可以说js原型弄明白了,那么学习js就得了一种质的飞跃,今天我们就来看看这个在前端面试中的高频考题究竟是怎么一回事。
JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象
当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾
准确地说,这些属性和方法定义在Object的构造器函数(constructor functions)之上的prototype属性上,而非实例对象本身
原型实例:
函数可以有属性。每个函数都有一个特殊的属性叫作原型prototype
function doSomething(){}
console.log( doSomething.prototype );
控制台输出
{
constructor: ? doSomething(),
__proto__: {
constructor: ? Object(),
hasOwnProperty: ? hasOwnProperty(),
isPrototypeOf: ? isPrototypeOf(),
propertyIsEnumerable: ? propertyIsEnumerable(),
toLocaleString: ? toLocaleString(),
toString: ? toString(),
valueOf: ? valueOf()
}
}
上面这个对象,就是大家常说的原型对象
可以看到,原型对象有一个自有属性constructor,这个属性指向该函数,如下图关系展示
原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法
在对象实例和它的构造器之间建立一个链接(它是__proto__属性,是从构造函数的prototype属性派生的),之后通过上溯原型链,在构造器中找到这些属性和方法
原型链实例:
function Person(name) {
this.name = name;
this.age = 18;
this.sayName = function() {
console.log(this.name);
}
}
// 第二步 创建实例
var person = new Person('person')
根据代码,我们可以得到下图
下面分析一下:
下面首先要看几个概念:
__proto__作为不同对象之间的桥梁,用来指向创建它的构造函数的原型对象的
每个对象的__proto__都是指向它的构造函数的原型对象prototype的
person1.__proto__ === Person.prototype
构造函数是一个函数对象,是通过 Function构造器产生的
Person.__proto__ === Function.prototype
原型对象本身是一个普通对象,而普通对象的构造函数都是Object
Person.prototype.__proto__ === Object.prototype
刚刚上面说了,所有的构造器都是函数对象,函数对象都是 Function构造产生的
Object.__proto__ === Function.prototype
Object的原型对象也有__proto__属性指向null,null是原型链的顶端
Object.prototype.__proto__ === null
到此我们的原型和原型链的文章是结束了,如果上面的内容有错,请指出,我会及时改正.相互学习,共同进步. 感谢你的关注…
想学前端的可以联系我Q裙:714205369
Git 是一个分布式版本控制软件,与CVS、Subversion一类的集中式版本控制工具不同...
windowsubuntu系统引导修复 0 前言 1 新建ESP分区并修复windows引导 2 Ubuntu系...
在使用PyVista进行多线程同时显示多个窗口的时候发现开启多个线程显示窗口窗口会...
JUC包下的线程安全的list和人为使ArrayList线程安全 可以人为的模拟出一个线程安...
在服务器上使用openguass教学 我们学校数据库课竟然要使用opengauss在虚拟机上、...
复制代码 代码如下: html { overflow: hidden; } body { overflow: hidden; } 在...
1、 HTTP服务器. 2、性能测试工具推荐 3、 图片篇. 4、 如何加载JS,JS应该放在...
声明本文只作学习研究禁止用于非法用途否则后果自负如有侵权请告知删除谢谢 文章...
问题: 我在 Vue 中有一个 form 表单,用于上传博客帖子,它有标题、正文、描述...
项目场景: 数据可视化大屏开发的过程中,需要实现一种滚动数字的效果,在使用vu...