理解JavaScript中的原型和原型链(二)

之前关于原型和原型链的笔记现在看来理解还是浮于表面,于是新开一章。

通俗易懂的介绍下原型和原型链

刚毕业的小王没有自己的房子,但是可以住父母的房子,父母就可以看作是小王的原型,父母的爸爸妈妈也就是爷爷奶奶也有自己的房子(原型)。自己、父母、爷爷奶奶这一条链条就是原型链

原型

面试题:什么是原型

每个对象在其内部初始化拥有的一个属性,就是原型(prototype)。
对象以其原型为模板,从原型继承方法和属性,这些属性和方法定义在对象的构造器函数的 prototype 属性上,而非对象实例本身

ps:也有例外,看下面的代码

1
2
3
4
5
6
7
8
9
// Object.creat第一个参数为创建的对象指定原型,我们赋值为null
// obj是完全的数据字典对象
let obj = Object.create(null, {
name: {
value: 'jack'
}
});
console.log(obj) // {name: "jack"}
console.log(Object.getPrototypeOf(obj)) // null

prototype 和 __proto__区别

  1. prototype是函数的属性,__proto__是对象的,除了字符串、数字、true、false、null和undefined外,JavaScript中的其他值都是对象,所以函数两个都有
  2. 每个变量都会有一个__proto__属性,表示的是隐式原型。一个对象的隐式原型指向的是构造该对象的构造函数的原型。例子如下:
1
2
[].__proto__ === [].constructor.prototype;  // true
[].__proto__ === Array.prototype; // true

对象自身的方法和原型上的方法冲突了?

引用文章开头的例子,自己有房子了当然不需要住在父母的房子里了呀。

1
2
3
4
5
6
7
8
9
10
11
let hd = {
show() {
console.log(1)
}
}
console.dir(hd)
hd.__proto__.show = function () {
console.log(2)
}
console.dir(hd)
hd.show() // 1

原型链

原型链:是指一个对象继承的所有对象,称为这个对象的原型链


理解JavaScript中的原型和原型链(二)
https://xypecho.github.io/2021/02/03/理解JavaScript中的原型和原型链-二/
作者
很青的青蛙
发布于
2021年2月3日
许可协议