kujian / daily-interview-question

每日一道大厂前端面试题,每天半个小时学习,一年后会看到不一样的自己
81 stars 11 forks source link

第二题:说说你对JavaScript原型和原型链的理解 #2

Open kujian opened 5 years ago

kujian commented 5 years ago

上图:

实际例子:

//构造函数
function Person(){}

//实例对象
var person = new Person();

//实例对象的私有属性 __proto__  指向它的原型对象(prototype)
console.log(person.__proto__ === Person.prototype); 

//该原型对象也有一个自己的原型对象 ,层层向上直到一个对象的原型对象为 null。
console.log(Person.prototype.prototype);

// 每个原型对象都有一个 constructor 属性指向关联的构造函数。
console.log(Person === Person.prototype.constructor); // true

//当获取 person.constructor 时,其实 person 中并没有 constructor 属性,当不能读取到constructor 属性时,会从 person 的原型也就是 Person.prototype 中读取,正好原型中有该属性,
//相当于:person.constructor === Person.prototype.constructor
console.log(person.constructor === Person); // true

//Object.prototype.__proto__ 的值为 null 跟 Object.prototype 没有原型
console.log(Object.prototype.__proto__ === null);

//跟上面的类似,每个原型对象都有一个 constructor 属性指向关联的构造函数
console.log(Object.prototype.constructor === Object);

prototype 是函数才会有的属性, 而 __proto__ 是几乎所有对象都有的属性

总结:

  1. 实例对象具有属性 __proto__,可称为隐式原型, 指向原构造函数的原型对象。
  2. 构造函数具有自己特有的属性——原型属性(prototype),这个属性是一个指针,指向一个对象,也叫原型对象(包含所有实例共享的属性和方法)。
  3. 每个原型对象都有一个 constructor 属性,这个属性包含了一个指针,指向原关联的构造函数

参考链接:

kujian commented 5 years ago
person.__proto__ === Person.prototype
person.constructor === Person.prototype.constructor === Person === person.__proto__.constructor
songzeng2016 commented 5 years ago

1、所有的对象 (实例、构造函数、原型) 都有隐式原型 (proto) 2、所有的构造函数都有显式原型 (prototype) 3、实例的隐式原型指向其构造函数的显式原型 4、构造函数的隐式原型指向 Function.prototype 5、构造函数显式原型的隐式原型指向 Object.prototype Object.prototype 是特殊的存在,它的隐式原型指向 null

appreturn commented 5 years ago

函数有隐式原型吗?好像没有吧

songzeng2016 commented 5 years ago

函数有隐式原型吗?好像没有吧

对象都有隐式原型,函数属于对象,所以函数也有隐式原型

ciloi commented 5 years ago

每个实例对象都有原型,每个构造函数也都能创建实例,将构造函数f1的原型指向构造函数f2的实例,那么构造函数f1的实例对象就能访问f2的原型,以此类推,就构成了原型链 ps: 面试组织语言好痛苦

guanxc9876 commented 4 years ago

这种原型的用途是什么呢。。。