JS原型链_原型链面试题

JS原型链_原型链面试题一、原型链图示Foo为构造函数,foo是Foo的实例化对象,Foo.prototype是原型对象。__proto__属性是对象特有的,prototype属性是函数特有的。二、原型链的查找机制js规定,所有的(实例)对象都有自己的原型对象(Foo.prototype)。查找的顺序是:对象的原

大家好,欢迎来到IT知识分享网。

一、原型链图示

Foo为构造函数,foo是Foo的实例化对象,Foo.prototype是原型对象。
__proto__属性是对象特有的,prototype属性是函数特有的。
JS原型链_原型链面试题

二、原型链的查找机制

js规定,所有的(实例)对象都有自己的原型对象(Foo.prototype)。
查找的顺序是:对象的原型 ==> 原型的原型 ==> 原型的原型的原型 ==> … ==> Object.prototype ==> null
如果一层一层查找,所有的对象的原型都会找到Object.prototype,所有的对象都继承了Object.prototype中的属性和方法。 如toString()
JS原型链_原型链面试题

三、原型链的作用

定制所有实例对象共享的属性和方法。
读取属性和方法的规则:

  1. js引擎会先寻找对象本身的属性和方法,如果找不到那就去原型对象上去找,如果还是找不到,就去原型的原型去找,如果直到最顶层Object.prototype还是找不到,就会返回undefined。
  2. 如果对象和它的原型都定制了同名的属性,那么优先读取对象自身的属性。
function Foo() {};
Foo.prototype.name = 'mm';
var f = new Foo();
console.log(f.age); // undefined
f.name = 'gg'
console.log(f.name); // gg
console.log(Foo.prototype.name); // mm

四、constructor属性

constructor表示原型对象和构造函数之间的关联关系。
现在我们改造一个自定义的数组对象,就可以通过prototype实现。
我们知道原型对象的constructor是指向构造函数本身的,因此当我们改变了原型对象的指向时,要把constructor改回自定义的构造函数。以免出现引用问题。

function myArray() {};
myArray.prototype = Array.prototype; // 把数组的属性和方法赋值给myArray
myArray.prototype.constructor = myArray; // 把构造器指向myArray 不改的话指向Array
var arr = new myArray();
arr.push(1,2,3);
console.log(myArray.prototype.constructor === myArray); // true

五、构造函数、原型对象、实例对象之间的关系

实例对象的__proto__属性指向了原型对象。
原型对象的constructor属性指向了构造函数。
实例对象的constructor属性继承自原型对象的constructor,所以同样指向了构造函数。
(说白了还是那张原型链的图。。。)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/28218.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信