第二题:说说你对JavaScript原型和原型链的理解
kujian opened this issue · 7 comments
kujian commented
第二题:说说你对JavaScript原型和原型链的理解
kujian commented
上图:
实际例子:
//构造函数
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__
是几乎所有对象都有的属性
总结:
- 实例对象具有属性
__proto__
,可称为隐式原型, 指向原构造函数的原型对象。 - 构造函数具有自己特有的属性——原型属性(
prototype
),这个属性是一个指针,指向一个对象,也叫原型对象(包含所有实例共享的属性和方法)。 - 每个原型对象都有一个
constructor
属性,这个属性包含了一个指针,指向原关联的构造函数
参考链接:
kujian commented
person.__proto__ === Person.prototype
person.constructor === Person.prototype.constructor === Person === person.__proto__.constructor
songzeng2016 commented
1、所有的对象 (实例、构造函数、原型) 都有隐式原型 (proto)
2、所有的构造函数都有显式原型 (prototype)
3、实例的隐式原型指向其构造函数的显式原型
4、构造函数的隐式原型指向 Function.prototype
5、构造函数显式原型的隐式原型指向 Object.prototype
Object.prototype 是特殊的存在,它的隐式原型指向 null
appreturn commented
函数有隐式原型吗?好像没有吧
songzeng2016 commented
函数有隐式原型吗?好像没有吧
对象都有隐式原型,函数属于对象,所以函数也有隐式原型
ciloi commented
每个实例对象都有原型,每个构造函数也都能创建实例,将构造函数f1的原型指向构造函数f2的实例,那么构造函数f1的实例对象就能访问f2的原型,以此类推,就构成了原型链
ps: 面试组织语言好痛苦
guanxc9876 commented
这种原型的用途是什么呢。。。